RT,只过了第一个点
// Problem: P3834 【模板】可持久化线段树 2(主席树)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3834
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)
#include <bits/stdc++.h>
using namespace std;
#define M 200005
int n,m,cntp,a[M],r[M],f[M],x,y,k;
struct node
{
int fl,ll,rr,fr,v;
}t[M*30],b[M];
bool cmp(node a,node b)
{
return a.v<b.v;
}
int build(int l,int r)
{
int res=++cntp;
t[res].ll=l;t[res].rr=r;
if(l==r) return res;
int mid=(l+r)/2;
t[res].fl=build(l,mid);
t[res].fr=build(mid+1,r);
return res;
}
int ins(int x,int l,int r,int fat)
{
int res=++cntp;
t[res]=t[fat];t[res].v++;
if(l==r)
{
return res;
}
int mid=(l+r)/2;
if(mid>=x)
{
t[res].fl=ins(x,l,mid,t[fat].fl);
}
else
{
t[res].fr=ins(x,mid+1,r,t[fat].fr);
}
return res;
}
void Query(int A,int B,int k)
{
if(t[A].ll==t[A].rr)
{
cout<<b[t[A].ll].v<<endl;
return;
}
int lnow=(t[t[B].fl].v-t[t[A].fl].v);
if(lnow>=k)
{
Query(t[A].fl,t[B].fl,k);
}
else
{
Query(t[A].fr,t[B].fr,k);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>b[i].v;
a[i]=b[i].v;
b[i].fr=i;
}
sort(b+1,b+1+n,cmp);
for(int i=1;i<=n;i++)
{
f[b[i].fr]=i;
}
r[0]=build(1,n);
for(int i=1;i<=n;i++)
{
r[i]=ins(f[i],1,n,r[i-1]);
}
for(int i=1;i<=m;i++)
{
cin>>x>>y>>k;
Query(r[x-1],r[y],k);
}
return 0;
}