求助RE 11 主席树
查看原帖
求助RE 11 主席树
1351126
General0826楼主2024/10/8 10:35

莱德,需要你们!

#include<bits/stdc++.h>
#define lt(x) tr[x].lt
#define rt(x) tr[x].rt
#define h(x) tr[x].h
#define mid ((L+R)>>1)
#define ll long long
using namespace std;
const int N=2e5+5;
ll n,m,len=0,cnt=0,a[N],b[N],Gen[N],ans=0;
struct tree{
	ll lt,rt,h;
}tr[N*34];
ll Q(ll x){
	ll l=0,r=len+1;
	while(l+1<r){
		ll md=(l+r)>>1;
		if(b[md]<=x) l=md;
		else r=md;
	}
	return l;
}
void up(ll cur){
	h(cur)=h(lt(cur))+h(rt(cur));
}
ll nw(ll cur){
	tr[++cnt]=tr[cur];
	return cnt;
}
ll build(ll L,ll R){
	ll dx=++cnt;
	if(L==R) return dx;
	rt(dx)=build(mid+1,R);
	lt(dx)=build(L,mid);
	return dx;
} 
ll ins(ll cur,ll L,ll R,ll x,ll w){
	ll dx=nw(cur);
	if(L==R){
		h(dx)+=w;
		return dx;
	}
	if(x<=mid) 
		lt(dx)=ins(lt(cur),L,mid,x,w);
	else 
		rt(dx)=ins(rt(cur),mid+1,R,x,w);
	up(dx);
	return dx;
}
ll res(ll cur,ll L,ll R,ll x)
{
	
	if(R<=x)
		return h(cur);
	ll cnt=0;
	if(L<=x){
		cnt+=res(lt(cur),L,mid,x);
	}
	if(mid+1<=x){
		cnt+=res(rt(cur),mid+1,R,x);
	}
	return cnt;
}
int main(){
	cin>>n;
	for(ll i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+1+n);
	for(ll i=1;i<=n;i++)
		if(b[i]!=b[i+1])
			b[++len]=b[i];
	Gen[0]=build(1,len);
	for(ll i=1;i<=n;i++)
		Gen[i]=ins(Gen[i-1],1,len,Q(a[i]),a[i]);
	cin>>m;
	for(ll i=1;i<=m;i++){
		ll l,r,x;
		cin>>l>>r>>x;
		l^=ans,r^=ans,x^=ans;
		x=Q(x);
		ans=res(Gen[r],1,len,x)-res(Gen[l-1],1,len,x);
		cout<<ans<<'\n';
	}
	return 0;
}

2024/10/8 10:35
加载中...