萌新求助,主席树MLE
查看原帖
萌新求助,主席树MLE
203008
YamadaRyou楼主2021/4/21 17:27
#include<cstdio>
typedef long long ll;
struct tree{
    int sum;
    int lc, rc;
    tree(int a=0,int b=0,int c=0) {
        sum=a;
        lc=b;
        rc=c;
    }
}node[5300001];
int cnt;
int newnode(int a,int b,int c) {
    node[++cnt]=tree(a,b,c);
    return cnt;
}
int add(int rt,ll x,ll l,ll r) {
    if(l==r)
        return newnode(node[rt].sum+1,0,0);
    ll mid=l+r>>1;
    if(x<=mid) 
        return newnode(node[rt].sum+1,add(node[rt].lc,x,l,mid),node[rt].rc);
    return newnode(node[rt].sum+1,node[rt].lc,add(node[rt].rc,x,mid+1,r));
}
ll query(int rtl,int rtr,int k,ll l,ll r) {
    if(l==r)
        return l;
    int lcsum=node[node[rtr].lc].sum-node[node[rtl].lc].sum;
    ll mid=l+r>>1;
    if(lcsum>=k)
        return query(node[rtl].lc,node[rtr].lc,k,l,mid);
    else 
        return query(node[rtl].rc,node[rtr].rc,k-lcsum,mid+1,r);
}
int root[500001];
int main() {
    int n,m;
    std::scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {
        ll x;
        std::scanf("%lld",&x);
        root[i]=add(root[i-1],x,0x8000000000000000LL,0x7fffffffffffffffLL);
    }
    while(m--) {
        ll s,t,k;
        std::scanf("%lld%lld%lld",&s,&t,&k);
        std::printf("%lld\n",query(root[s-1],root[t],k,0x8000000000000000LL,0x7fffffffffffffffLL));
    }
    return 0;
}
2021/4/21 17:27
加载中...