RT,我想知道是不是因为我写的太菜了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
const int inf=1e9;
inline int _abs(int x){if(x>0) return x;return -x;}
struct BIT{
int tree[N];
int lowbit(int x){
return x&(-x);
}
void modify(int pos,int val){
while(pos<N){
tree[pos]+=val;
pos+=lowbit(pos);
}
}
int query(int pos){
int ans=0;
while(pos){
ans+=tree[pos];
pos-=lowbit(pos);
}
return ans;
}
}btree;
struct Query{
int x,y,k,id;
bool type;
}t[N*2],q1[N*2],q2[N*2]; int cnt;
int a[N],F[N];
void solve(int l,int r,int L,int R){
if(l>r) return;
if(L==R){
for(int i=l;i<=r;i++){
if(t[i].type) F[t[i].id]=L;
}
return;
}
int mid=(L+R)/2;
int cnt1=0,cnt2=0;
for(int i=l;i<=r;i++){
if(!t[i].type){
if(t[i].x<=mid){
btree.modify(t[i].id,1);
q1[++cnt1]=t[i];
}else q2[++cnt2]=t[i];
}else{
int tmp=btree.query(t[i].y)-btree.query(t[i].x-1);
if(tmp>=t[i].k) q1[++cnt1]=t[i];
else{
t[i].k-=tmp;
q2[++cnt2]=t[i];
}
}
}
for(int i=1;i<=cnt1;i++) if(!q1[i].type) btree.modify(q1[i].id,-1);
for(int i=1;i<=cnt1;i++) t[i+l-1]=q1[i];
for(int i=1;i<=cnt2;i++) t[cnt1+l+i-1]=q2[i];
solve(l,l+cnt1-1,L,mid);
solve(l+cnt1,r,mid+1,R);
}
void fake_main(){
int n,q; cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
t[++cnt]={a[i],1,inf,i,0};
}
for(int i=1;i<=q;i++){
int l,r,k; cin>>l>>r>>k;
t[++cnt]={l,r,k,i,1};
}
solve(1,cnt,-inf,inf);
for(int i=1;i<=q;i++){
cout<<F[i]<<"\n";
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t; t=1;
while(t--) fake_main();
}