20分Wα求助SOS
查看原帖
20分Wα求助SOS
740329
sunaohua楼主2023/3/23 16:24
#include<bits/stdc++.h>
using namespace std;
struct node {
    int num;
    int val;
} c[400005];
const int maxn=20000005;
int L[maxn],R[maxn],sum[maxn],T[maxn];
int z[400005];
int zz[400005];
int cnt=0;
int build(int l,int r) {
    int num=++cnt;
    if(l!=r) {
        int mid=(l+r)/2;
        L[num]=build(l,mid);
        R[num]=build(mid+1,r);
    }
    return num;
}
int update(int pre,int l,int r,int x) {
    int num=++cnt;
    L[num]=L[pre];
    R[num]=R[pre];
    sum[num]=sum[pre]+1;
    if(l!=r) {
        int mid=(l+r)/2;
        if(x<=mid)
            L[num]=update(L[pre],l,mid,x);
        else
            R[num]=update(R[pre],mid+1,r,x);
    }
    return num;
}
int query(int u,int v,int l,int r,int k) {
    if(l==r)
        return zz[l];
    int mid=(l+r)/2;
    int num=sum[L[v]]-sum[L[u]];
    if(num>=k)
        return (query(L[u],L[v],l,mid,k));
    else
        return (query(R[u],R[v],mid+1,r,k-num));
}
bool cmp(node c1,node c2) {
    return c1.val<c2.val;
}
int main() {
    int n,m;
    cin>>n>>m;
    for(int i=1; i<=n; i++) {
        cin>>c[i].val;
        c[i].num=i;
    }
    sort(c+1,c+n+1,cmp);
    int tot=0;
    for(int i=1; i<=n; i++) {
        if(c[i].val!=c[i-1].val)
            tot++;
        z[c[i].num]=tot;
        zz[i]=c[i].val;
    }
    T[0]=build(1,tot);
    for(int i=1; i<=n; i++) {
        T[i]=update(T[i-1],1,tot,z[i]);
    }
    int l,r,k,p=0;
    while(m) {
    p++;
    	m--;
        cin>>l>>r>>k;
        cout<<query(T[l-1],T[r],1,tot,k)<<endl;
    }
    return 0;
}
2023/3/23 16:24
加载中...