社区讨论

【悬 2 关】20pts 求调

P6617查找 Search参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mk9hssw4
此快照首次捕获于
2026/01/11 16:49
上个月
此快照最后确认于
2026/01/15 17:05
上个月
查看原帖
代码CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
int n,m,w,a[maxn],tr[maxn<<2],cnt,pre[maxn];
set<int>v[maxn];
void push_up(int id){
	tr[id]=max(tr[id<<1],tr[id<<1|1]);
}
void build(int l,int r,int id){
	if(l==r){
		tr[id]=pre[l];
		return;
	}
	int mid=l+r>>1;
	build(l,mid,id<<1);
	build(mid+1,r,id<<1|1);
	push_up(id);
}
void update(int x,int s,int t,int id,int val){
	if(s==t){
		tr[id]=val;
		return;
	}
	int mid=s+t>>1;
	if(x<=mid) update(x,s,mid,id<<1,val);
	else update(x,mid+1,t,id<<1|1,val);
	push_up(id);
}
int query(int l,int r,int s,int t,int id){
	if(s>=l && t<=r) return tr[id];
	int mid=s+t>>1,ans=0;
	if(l<=mid) ans=max(ans,query(l,r,s,mid,id<<1));
	if(r>mid) ans=max(ans,query(l,r,mid+1,t,id<<1|1));
	return ans;
}
void modify(int x,int val){
	auto it1=v[val].find(x);
	auto it2=v[w-val].lower_bound(x);
	if(it2==v[w-val].begin()){
		pre[x]=0;
		update(x,1,n,1,pre[x]);
	}
	else{
		if(val*2==w){
			pre[x]=*(--it2);
			update(x,1,n,1,pre[x]);
		}
		else if(it1==v[val].begin() || *(--it1)<=*(--it2)){
			pre[x]=*it2;
			update(x,1,n,1,pre[x]);
		}
		else{
			pre[x]=0;
			update(x,1,n,1,pre[x]);
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m>>w;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		if(!v[w-a[i]].empty()) pre[i]=*(--v[w-a[i]].end());
		else pre[i]=0;
		v[a[i]].insert(i);
	}
	build(1,n,1);
	while(m--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			int z=a[x];
			auto it=v[z].upper_bound(x);
			if(it!=v[z].end()) modify(*it,z);
			it=v[w-z].upper_bound(x);
			if(it!=v[w-z].end()) modify(*it,w-z);
			a[x]=y;
			v[z].erase(x);
			v[y].insert(x);
			it=v[y].upper_bound(x);
			if(it!=v[y].end()) modify(*it,y);
			it=v[w-y].upper_bound(x);
			if(it!=v[w-y].end()) modify(*it,w-y);
			modify(x,y);
		}
		else{
			x^=cnt;
			y^=cnt;
			int ret=query(x,y,1,n,1);
			if(ret>=x){
				cout<<"Yes\n";
				cnt++;
			}
			else cout<<"No\n";
		}
	}
	return 0;
}
调炸了,马蜂还行,对语义有疑问的可以问我。感谢大蛇

回复

1 条回复,欢迎继续交流。

正在加载回复...