主席树 20pts 找不到问题求调
查看原帖
主席树 20pts 找不到问题求调
342494
wxh666楼主2023/7/19 20:58

对前两个点https://www.luogu.com.cn/record/116460752

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int x,y,z;
struct t{
    int l,r;
    int lx,rx;
    int num;
}t[5000005];int tcnt,root[2000005];
int make(int l=1,int r=1e9)
{
    int now=++tcnt;
    t[now].l=l;t[now].r=r;
    return now;
}
void build()
{
    root[0]=make();
}
void add(int late,int now,int x)
{
    int mid=t[late].l+t[late].r>>1;
    if(!t[late].lx) t[late].lx=make(t[late].l,mid);
    if(!t[late].rx) t[late].rx=make(mid+1,t[late].r);
    if(t[now].l==t[now].r)
    {
        t[now].num++;
        return;
    }
    if(x<=mid)
    {
        t[now].rx=t[late].rx;
        t[now].lx=make(t[late].l,mid);
        add(t[late].lx,t[now].lx,x);
    }
    else
    {
        t[now].lx=t[late].lx;
        t[now].rx=make(mid+1,t[late].r);
        add(t[late].rx,t[now].rx,x);
    }
    t[now].num=t[t[now].lx].num+t[t[now].rx].num;
}
int ask(int k1,int k2,int x)
{
    if(t[k1].l==t[k1].r) return t[k1].l;
    int cnt=t[t[k1].lx].num-t[t[k2].lx].num;
    if(cnt>=x)
        return ask(t[k1].lx,t[k2].lx,x);
    else
        return ask(t[k1].rx,t[k2].rx,x-cnt);
}
int main()
{
	cin>>n>>m;
    build();
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&x);
        root[i]=make();
        add(root[i-1],root[i],x);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%lld%lld%lld",&x,&y,&z);
        printf("%lld\n",ask(root[y],root[x-1],z));
    }
	return 0;
}
2023/7/19 20:58
加载中...