#9#10,开大MLE,开小WA
查看原帖
#9#10,开大MLE,开小WA
643573
Anya0517楼主2024/12/12 13:32

可持久化线段树求条QWQ (=´ω`=)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=6e6+10;
int tot,n,m,l,r,k;
int sum[N],rt[N],ls[N],rs[N];
int a[N],ind[N],len;
int getid(const int &val){//lisanhua??? 
  return lower_bound(ind+1,ind+len+1,val)-ind;
}
int build(int l,int r){
    int root=tot++;
    if(l==r) return root;
    int mid=l+r>>1;
    ls[root]=build(l,mid);
    rs[root]=build(mid+1,r);
    return root;
}
int update(int k,int l,int r,int root){
    int dir=tot++;
    ls[dir]=ls[root];
	rs[dir]=rs[root];
	sum[dir]=sum[root]+1;
    if(l==r) return dir;
    int mid=l+r>>1;
    if(k<=mid)
        ls[dir]=update(k,l,mid,ls[dir]);
    else
        rs[dir]=update(k,mid+1,r,rs[dir]);
    return dir;
}
int query(int u,int v,int l,int r,int k){
    int mid=l+r>>1,
    x=sum[ls[v]]-sum[ls[u]];
    if(l==r) return l;
    if(k<=x)
        return query(ls[u],ls[v],l,mid,k);
    else 
        return query(rs[u],rs[v],mid+1,r,k-x);
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
	} 
    memcpy(ind,a,sizeof ind);//memcpy:复制 ? 
    sort(ind+1,ind+n+1);
    len=unique(ind+1,ind+n+1)-ind-1;//unique:去重 
    rt[0]=build(1,len);
	for(int i=1;i<=n;i++){
		rt[i]=update(getid(a[i]),1,len,rt[i-1]);
	}
    while(m--){
        cin>>l>>r>>k;
        int s=query(rt[l-1],rt[r],1,len,k);
        printf("%lld\n",ind[s]);
    }
}
2024/12/12 13:32
加载中...