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