64pts神秘代码求条
查看原帖
64pts神秘代码求条
889917
limingyuan333楼主2025/7/25 21:15
#include<bits/stdc++.h>
#define rint register int
#define ull unsigned long long
#define pii pair<int,int>
#define int long long
using namespace std;
const int N=2e6+10;
const int inf=3e9+10;
int n,m,a[N];
ull xr[N],val[N],t[N];
int g[N],op[N],x[N],y[N];
int lowbit(int x){
	return x&-x;
}
void add(int x,int w){
	for(int i=x;i<=n;i+=lowbit(i)) t[i]^=w;
}
ull sum(int x){
	ull num=0;
	if(x==0) return 0;
	for(int i=x;i;i-=lowbit(i)) num^=t[i];
	return num;
}
struct node{
	int mx,mi;
	friend node operator +(node x,node y){
		return (node){max(x.mx,y.mx),min(x.mi,y.mi)};
	}
}tr[N<<2];
void push_up(int p){
	tr[p].mx=max(tr[p<<1].mx,tr[p<<1|1].mx);
	tr[p].mi=min(tr[p<<1].mi,tr[p<<1|1].mi);
}
void build(int p,int l,int r){
	if(l==r) {
		tr[p].mi=tr[p].mx=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);
}
void update(int p,int l,int r,int x,int w){
	if(l==r){
		tr[p].mx=tr[p].mi=w;return ;
	}
	int mid=l+r>>1;
	if(x<=mid) update(p<<1,l,mid,x,w);
	else update(p<<1|1,mid+1,r,x,w);
	push_up(p);
} 
node query(int p,int l,int r,int x,int y){
	if(x<=l&&r<=y) return tr[p];
	int mid=l+r>>1;
	node res=(node){-inf,inf};
	if(x<=mid) res=res+query(p<<1,l,mid,x,y);
	if(y>mid) res=res+query(p<<1|1,mid+1,r,x,y);
	return res;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL),cout.tie(NULL);int cnt=0;
	cin>>n>>m;mt19937_64 rng(time(0));
	for(int i=1;i<=n;i++){
		cin>>a[i];g[++cnt]=a[i];g[++cnt]=a[i]-1;
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>op[i]>>x[i]>>y[i];
		if(op[i]==1) g[++cnt]=y[i],g[++cnt]=y[i]-1;
	}
	sort(g+1,g+1+cnt);
	int tot=unique(g+1,g+1+cnt)-g-1;
	for(int i=1;i<=tot;i++) val[i]=rng()*rng(),xr[i]=xr[i-1]^val[i];
	for(int i=1;i<=n;i++){
		int t=lower_bound(g+1,g+1+tot,a[i])-g;
		add(i,val[t]);
	}
	for(int i=1;i<=m;i++){
		if(op[i]==1){
			int t1=lower_bound(g+1,g+1+tot,a[x[i]])-g;
			int t2=lower_bound(g+1,g+1+tot,y[i])-g;
			update(1,1,n,x[i],y[i]);add(x[i],val[t1]^val[t2]);a[x[i]]=y[i];
		}
		else{
			node res=query(1,1,n,x[i],y[i]);
			int t1=lower_bound(g+1,g+1+tot,res.mx)-g;
			int t2=lower_bound(g+1,g+1+tot,res.mi-1)-g;
			if((ull)(sum(y[i])^sum(x[i]-1))==(ull)(xr[t1]^xr[t2])) cout<<"damushen"<<'\n';
			else cout<<"yuanxing"<<'\n';
		}
	}
	return 0;
} 
2025/7/25 21:15
加载中...