fork(1) download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. vector<pair <int, int>> tree;
  4. pair <int, int> merge(pair <int, int> a, pair <int, int> b) {
  5. if(a.first > b.first) return a;
  6. if( a.first < b.first) return b;
  7. return {a.first, a.second+b.second};
  8. }
  9. void build(int a[], int v, int l, int r) {
  10. if(r-l==1) {
  11. tree[v].first = a[l];
  12. tree[v].second = l;
  13. return;
  14. }
  15. int m = (l+r) / 2;
  16. build(a, 2*v+1, l, m);
  17. build(a, 2*v+2, m, r);
  18. tree[v] = merge(tree[2*v+1], tree[2*v+2]);
  19. }
  20. pair <int, int> get(int v, int l, int r, int ql, int qr) {
  21. pair <int, int> E={0, 1};
  22. if (ql<=l and r<=qr) {
  23. return tree[v];
  24. }
  25. if (r<=ql or qr<=l) {
  26. return E;
  27. }
  28. int m = (l+r) / 2;
  29. return merge(get(2*v+1, l, m, ql, qr), get(2*v+2, m, r, ql, qr));
  30. }
  31. int main() {
  32. int n;
  33. cin >> n;
  34. tree.resize(4*n);
  35. int a[n];
  36. for (int i = 0; i < n; i++)
  37. cin >> a[i];
  38. build(a, 0, 0, n);
  39. int k;
  40. cin >> k;
  41. while(k--) {
  42. int l, r;
  43. cin >> l >> r;
  44. cout << get(0, 0, n, l-1, r).second+1 << '\n';
  45. }
  46. return 0;
  47. }
Success #stdin #stdout 0.01s 5284KB
stdin
5
2 2 2 1 5
2
2 3
2 5
stdout
4
5