main.cc 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <algorithm>
  2. #include <cstdio>
  3. using namespace std;
  4. const int N = 50000;
  5. const int INF = 1 << 30;
  6. struct TNode {
  7. int min;
  8. int max;
  9. int beg;
  10. int end;
  11. TNode *l;
  12. TNode *r;
  13. int mid() { return beg + (end - beg) / 2; }
  14. };
  15. TNode tree[2 * N];
  16. int tid = 0;
  17. TNode *build_tree(TNode *root, int beg, int end) {
  18. root->beg = beg;
  19. root->end = end;
  20. root->max = -INF;
  21. root->min = INF;
  22. if (beg != end) {
  23. root->l = build_tree(&tree[tid++], beg, root->mid());
  24. root->r = build_tree(&tree[tid++], root->mid() + 1, end);
  25. }
  26. return root;
  27. }
  28. void insert(int key, int val) {
  29. TNode *root = &tree[0];
  30. while (root->beg != root->end) {
  31. root->min = min(root->min, val);
  32. root->max = max(root->max, val);
  33. if (key <= root->mid())
  34. root = root->l;
  35. else
  36. root = root->r;
  37. }
  38. root->min = val;
  39. root->max = val;
  40. }
  41. pair<int, int> query(TNode *root, int beg, int end) {
  42. if (root->beg == beg && root->end == end) return {root->max, root->min};
  43. if (root->mid() < beg) return query(root->r, beg, end);
  44. if (end <= root->mid()) return query(root->l, beg, end);
  45. pair<int, int> pl = query(root->l, beg, root->mid());
  46. pair<int, int> pr = query(root->r, root->mid() + 1, end);
  47. return {max(pl.first, pr.first), min(pl.second, pr.second)};
  48. }
  49. int main() {
  50. int n, q, h;
  51. scanf("%d %d", &n, &q);
  52. build_tree(&tree[tid++], 1, n);
  53. for (int i = 1; i <= n; i++) {
  54. scanf("%d", &h);
  55. insert(i, h);
  56. }
  57. for (int i = 0, s, e; i < q; i++) {
  58. scanf("%d %d", &s, &e);
  59. pair<int, int> p = query(&tree[0], s, e);
  60. printf("%d\n", p.first - p.second);
  61. }
  62. return 0;
  63. }