奇怪的事情
查看原帖
奇怪的事情
174806
xbb2楼主2022/7/27 22:00
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int a[N*21],rt[N*21],b[N*21],n,q;
int read(){
	int ans=0,flag=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')flag=-1,ch=getchar();}
	while(ch>='0'&&ch<='9'){ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();}
	return ans*flag;
}
struct tree{
	int d[N*21],lc[N*21],rc[N*21],cnt=0;
	inline void build(int s,int t,int &p){
		t=++cnt;if(s==t){return ;}
		int m=s+((t-s)>>1);
		build(s,m,lc[p]),build(m+1,t,rc[p]);
	}
	inline void update(int x,int s,int t,int &p,int pre){
		p=++cnt,lc[p]=lc[pre],rc[p]=rc[pre],d[p]=d[pre]+1;
		if(s==t){return ;}int m=s+((t-s)>>1);
		if(x<=m)update(x,s,m,lc[p],lc[pre]);
		else	update(x,m+1,t,rc[p],rc[pre]);
	}
	inline int getans(int s,int t,int u,int v,int k){
		int ans=0,m=s+((t-s)>>1),x=d[lc[v]]-d[lc[u]];
		if(s==t)return s;
		if(x>=k)ans=getans(s,m,lc[u],lc[v],k);
		else	ans=getans(m+1,t,rc[u],rc[v],k-x);
		return ans;
	}
}T;
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)b[i]=a[i];
	sort(b+1,b+1+n);int len=unique(b+1,b+1+n)-b-1;
	T.build(1,len,rt[0]);
	for(int i=1;i<=n;i++){
		int x=lower_bound(b+1,b+1+len,a[i])-b;
		T.update(x,1,len,rt[i],rt[i-1]);
	}
	for(int i=1;i<=q;i++){
		int l,r,k;scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",b[T.getans(1,len,rt[l-1],rt[r],k)]);
	}
	return 0;
}

第14行上的 t=++cnt 明显是错的

但可以AC

求解释

2022/7/27 22:00
加载中...