protagonist

Kth number

Kth number

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 17925    Accepted Submission(s): 5442


Problem Description
Give you a sequence and ask you the kth big number of a inteval.
 

 

Input
The first line is the number of the test cases.
For each test case, the first line contain two integer n and m (n, m <= 100000), indicates the number of integers in the sequence and the number of the quaere.
The second line contains n integers, describe the sequence.
Each of following m lines contains three integers s, t, k.
[s, t] indicates the interval and k indicates the kth big number in interval [s, t]
 

 

Output
For each test case, output m lines. Each line contains the kth big number.
 

 

Sample Input
1 10 1 1 4 2 3 5 6 7 8 9 0 1 3 2
 

 

Sample Output
2
思路:裸的主席树。
#include<bits/stdc++.h>
#include<queue>
#include<cstdio>
#include<iostream>
#define REP(i, a, b) for(int i = (a); i <= (b); ++ i)
#define REP(j, a, b) for(int j = (a); j <= (b); ++ j)
#define PER(i, a, b) for(int i = (a); i >= (b); -- i)
using namespace std;
template <class T>
inline void rd(T &ret){
    char c;
    ret = 0;
    while ((c = getchar()) < '0' || c > '9');
    while (c >= '0' && c <= '9'){
        ret = ret * 10 + (c - '0'), c = getchar();
    }
}
const int maxn=1e5+10;
int T,n,m,lr[maxn<<5],rr[maxn<<5],rt[maxn],p[maxn],q[maxn],tot,s[maxn<<5];
int build(int l,int r){
    int root=++tot;
    s[root]=0;
    if(l<r){
        int mid=l+r>>1;
        lr[root]=build(l,mid);
        rr[root]=build(mid+1,r);
    }
    return root;
}
void update(int l,int r,int x,int &y,int val){
     y=++tot;
     s[y]=s[x]+1;
     if(l==r)return;
     lr[y]=lr[x],rr[y]=rr[x];
     int mid=(l+r)/2;
     if(val<=mid)update(l,mid,lr[x],lr[y],val);
     else update(mid+1,r,rr[x],rr[y],val);
}
int query(int l,int r,int x,int y,int val){
     if(l==r)return l;
     int mid=(l+r)/2;
     int sum=s[lr[y]]-s[lr[x]];
     if(sum>=val)return query(l,mid,lr[x],lr[y],val);
     else return query(mid+1,r,rr[x],rr[y],val-sum);
     return 0;
}
int main()
{
    scanf("%d",&T);
    while(T--){
        tot=0;
        scanf("%d%d",&n,&m);
        REP(i, 1, n){
            scanf("%d",&p[i]);
            q[i]=p[i];
        }
        sort(q+1,q+1+n);
        int cnt=unique(q+1,q+1+n)-q-1;
        rt[0]=build(1,cnt);
        REP(i, 1, n){
             int now=lower_bound(q+1,q+1+cnt,p[i])-q;
             update(1,cnt,rt[i-1],rt[i],now);
        }
        while(m--){
            int l,r,k;
            scanf("%d%d%d",&l,&r,&k);
            cout<<q[query(1,cnt,rt[l-1],rt[r],k)]<<endl;
        }
    }
    return 0;
}

 

posted @ 2019-02-13 20:57  czy-power  阅读(130)  评论(0编辑  收藏  举报