MnZn刚学主席树,求助
查看原帖
MnZn刚学主席树,求助
654281
reclusive楼主2023/5/20 14:53

为什么这题不打离散化连样例都过不了??

#include<cstdio>
using namespace std;
const int N=311000;
struct trnode{int lc,rc,c;}tr[N*30];int root[N],trlen;
int a[N];
int build(int l,int r){
	trlen++;int now=trlen;
	tr[now]=trnode{-1,-1,0};
	if(l==r){
		tr[now].c=a[l];
		return trlen;
	}
	else{
		int mid=(l+r)>>1;
		tr[now].lc=build(l,mid);
		tr[now].rc=build(mid+1,r);
		return now;
	}
}
int insert(int now,int l,int r,int x){
	trlen++;int rt=trlen;
	tr[rt]=tr[now],tr[rt].c++;
	if(l==r)return rt;
	else{
		int mid=(l+r)>>1,lc=tr[now].lc,rc=tr[now].rc;
		if(x<=mid)tr[rt].lc=insert(lc,l,mid,x);
		else tr[rt].rc=insert(rc,mid+1,r,x);
		return rt;
	}
}
int query(int u,int v,int l,int r,int x){
	if(l==r)return l;
	else{
		int mid=(l+r)>>1;
		int sum=tr[tr[v].lc].c-tr[tr[u].lc].c;
		if(x<=sum)return query(tr[u].lc,tr[v].lc,l,mid,x);
		else return query(tr[u].rc,tr[v].rc,mid+1,r,x-sum);
	}
}
int main(){
	int n,m;scanf("%d%d",&n,&m);
	trlen=0;root[0]=build(1,n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		root[i]=insert(root[i-1],1,n,a[i]);
	}
	for(int i=1;i<=m;i++){
		int x,y,c;scanf("%d%d%d",&x,&y,&c);
		int ans=query(root[x-1],root[y],1,n,c);
		printf("%d\n",a[ans]);
	}
	return 0;
}
2023/5/20 14:53
加载中...