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