Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + 5;
- int A[N], tree[4 * N];
- int merge(int a, int b)
- {
- if(A[a] > A[b])
- return a;
- return b;
- }
- void build(int node, int l, int r)
- {
- if(l > r)
- return;
- if(l == r) {
- tree[node] = l;
- return;
- }
- int m = (l + r) / 2;
- build(2*node, l , m);
- build(2*node + 1, m + 1, r);
- tree[node] = merge(tree[2*node], tree[2*node + 1]);
- }
- int query(int node, int l, int r, int x, int y)
- {
- if(l > r or l > y or r < x)
- return 0;
- if(l >= x and r <= y)
- return tree[node];
- int m = (l + r) / 2;
- int q1 = query(2*node, l, m, x, y);
- int q2 = query(2*node + 1, m + 1, r, x, y);
- return merge(q1, q2);
- }
- int main()
- {
- int n, m; // n : no. of elements, m : no. of queries
- cin>>n>>m;
- for(int i = 1; i <= n; i++)
- cin>>A[i];
- build(1, 1, n);
- while(m--)
- {
- int l, r;
- cin>>l>>r;
- cout<<query(1, 1, n, l, r)<<"\n";
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment