fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. vector<pair<int, int>> tr;
  7. vector<int> A;
  8.  
  9. void build(int v, int l, int r) {
  10. if (r - l == 1) {
  11. tr[v].first = A[l];
  12. tr[v].second = l + 1;
  13. return;
  14. }
  15. int m = (l + r) / 2;
  16. build(2 * v + 1, l, m);
  17. build(2 * v + 2, m, r);
  18. tr[v] = max(tr[2 * v + 1], tr[2 * v + 2]);
  19. }
  20.  
  21. pair<int, int> query(int v, int l, int r, int ql, int qr) {
  22. if (ql == l && qr == r) {
  23. return tr[v];
  24. }
  25. if (qr <= ql) {
  26. return make_pair(-1e9, -1);
  27. }
  28. int m = (l + r) / 2;
  29. pair<int, int> left = query(2 * v + 1, l, m, ql, min(m, qr));
  30. pair<int, int> right = query(2 * v + 2, m, r, max(m, ql), qr);
  31. return max(left, right);
  32. }
  33.  
  34. void update(int v, int l, int r, int pos) {
  35. if (r - l == 1) {
  36. tr[v].first = A[l];
  37. return;
  38. }
  39. int m = (l + r) / 2;
  40. if (pos < m) {
  41. update(2 * v + 1, l, m, pos);
  42. } else {
  43. update(2 * v + 2, m, r, pos);
  44. }
  45. tr[v] = max(tr[2 * v + 1], tr[2 * v + 2]);
  46. }
  47.  
  48. int main()
  49. {
  50. int n;
  51. cin >> n;
  52. A.resize(n);
  53. for (int i = 0; i < n; ++i)
  54. cin >> A[i];
  55. tr.resize(4*n);
  56. build(0, 0, n);
  57. int k;
  58. cin >> k;
  59. while (k --> 0) {
  60. int l, r;
  61. cin >> l >> r;
  62. l--;
  63. pair<int, int> ans = query(0, 0, n, l, r);
  64. cout << ans.first << " " << ans.second << "\n";
  65. }
  66. return 0;
  67. }
  68.  
Success #stdin #stdout 0s 15240KB
stdin
5
7 3 1 6 4
3
1 5
2 4
3 3
stdout
7 1
6 4
1 3