Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define fast_read ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- #define ll long long
- #define SIZE 1000001
- #define F 40
- using namespace std;
- ll n,a[SIZE],tree[F * SIZE],root[SIZE],nxt,lft[F * SIZE],rgt[F * SIZE],q,i,j,d,rt,sz = 0;
- string ty;
- void update(int v,int v2,int l,int r,int in) {
- if (l == r) {
- tree[v] = tree[v2] + 1;
- return;
- }
- int m = (l + r)/2;
- if (in <= m) {
- rgt[v] = rgt[v2];
- lft[v] = ++nxt;
- update(lft[v],lft[v2],l,m,in);
- }
- else {
- lft[v] = lft[v2];
- rgt[v] = ++nxt;
- update(rgt[v],rgt[v2],m+1,r,in);
- }
- tree[v] = tree[lft[v]] + tree[rgt[v]];
- }
- ll getsum(int v,int l,int r,int li,int ri) {
- if (l > r || l > ri || r < li)return 0;
- if (l >= li && r <= ri)return tree[v];
- int m = (l + r) / 2;
- return getsum(lft[v],l,m,li,ri) + getsum(rgt[v],m + 1,r,li,ri);
- }
- int main()
- {
- fast_read
- cin>>n;
- cin>>q;
- for (i = 1;i<=n;i++) {
- cin>>a[i];
- sz = max(a[i],sz);
- }
- for (i = 1;i<=n;i++) {
- root[++rt] = ++nxt;
- update(root[rt],root[rt - 1],1,sz,a[i]);
- }
- /*while (q--) {
- cin>>i>>j>>d;
- cout<<getsum(root[i],1,sz,j,d)<<endl;
- }*/
- while (q--) {
- cin>>i>>j>>d;
- i++;
- j++;
- ll li,ri,ans = 0;
- li = 1;
- ri = d;
- while (li <= ri) {
- ll m = (li + ri) / 2;
- if (getsum(root[j],1,sz,m + 1,ri) - getsum(root[i - 1],1,sz,m + 1,ri) > 0) {
- if (li == ri) {
- ans = li;
- break;
- }
- else li = m + 1;
- }
- else if (getsum(root[j],1,sz,li,m) - getsum(root[i - 1],1,sz,li,m) > 0) {
- if (li == ri) {
- ans = li;
- break;
- }
- else ri = m;
- }
- else break;
- }
- cout<<ans<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment