求助主席树模板50pts
查看原帖
求助主席树模板50pts
581928
jasonliujiahua楼主2023/9/26 11:12
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=4e5+10,N=2e5;
int n,m,tot,a[maxn<<5],b[maxn<<5],rt[maxn<<5];
struct node
{
    int ls,rs,sum;
}t[maxn<<5];
void init()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]),b[i]=a[i];
    sort(b+1,b+n+1);
    n=unique(b+1,b+n+1)-b-1;
    for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+n+1,a[i])-b;
}
inline void modify(int &id,int pre,int l,int r,int x)
{
    id=++tot;
    t[id]=t[pre];
    t[id].sum++;
    if(l==r) return;
    int mid=(l+r)>>1;
    if(x<=mid) modify(t[id].ls,t[pre].ls,l,mid,x);
    else modify(t[id].rs,t[pre].rs,mid+1,r,x);
}
inline int query(int id1,int id2,int l,int r,int k)
{
    if(l==r) return l;
    int mid=(l+r)>>1;
    int sum1=t[t[id1].ls].sum-t[t[id2].ls].sum;
    if(sum1>=k) return query(t[id1].ls,t[id2].ls,l,mid,k);
    else return query(t[id1].rs,t[id2].rs,mid+1,r,k-sum1);
}
void build_tree()
{
    for(int i=1;i<=n;i++)
    {
        modify(rt[i],rt[i-1],1,n,a[i]);
    }
}
void work()
{
    for(int i=1;i<=m;i++)
    {
        int l,r,k;
        cin>>l>>r>>k;
      	cout<<b[query(rt[r],rt[l-1],1,n,k)]<<endl;
    }
}
signed main()
{
    init();
    build_tree();
    work();
    return 0;
}
2023/9/26 11:12
加载中...