社区讨论

求条,只WA#30 line 529

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mj4de0xv
此快照首次捕获于
2025/12/13 22:07
2 个月前
此快照最后确认于
2025/12/16 16:50
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls(p) p << 1
#define rs(p) p << 1 | 1
const int MX = 5e5 + 10;
int n,m,w,a[MX],last[MX],pre[MX],maxn[MX << 2],cnt;
bool vis[MX];
set<int> s[MX];
void pushup(int p)
{
	maxn[p] = max(maxn[ls(p)],maxn[rs(p)]);
}
void build(int p,int l,int r)
{
	if(l == r)
	{
		maxn[p] = pre[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(ls(p),l,mid);
	build(rs(p),mid + 1,r);
	pushup(p);
}
void change(int p,int pl,int pr,int x)
{
	if(pl == x && pr == x)
	{
		maxn[p] = pre[x];
		return;
	}
	int mid = (pl + pr) >> 1;
	if(x <= mid) change(ls(p),pl,mid,x);
	else change(rs(p),mid + 1,pr,x);
	pushup(p);
}
int query(int p,int pl,int pr,int l,int r)
{
	if(l <= pl && r >= pr) return maxn[p];
	int mid = (pl + pr) >> 1;
	int res = 0;
	if(l <= mid) res = max(res,query(ls(p),pl,mid,l,r));
	if(r > mid) res = max(res,query(rs(p),mid + 1,pr,l,r));
	return res;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	
	cin >> n >> m >> w;
	for(int i = 1;i <= n;i++) cin >> a[i];
	last[a[1]] = 1;
	s[a[1]].insert(1);
	for(int i = 2;i <= n;i++)
	{
		if(!vis[last[w - a[i]]] && last[w - a[i]])
		{
			pre[i] = last[w - a[i]];
			vis[last[w - a[i]]] = 1;
		}
		last[a[i]] = i;
		s[a[i]].insert(i);
	}
	build(1,1,n);
	while(m--)
	{
		int op,x,y;
		cin >> op >> x >> y;
		if(op == 1)
		{
			if(a[x] == y) continue;
			vector<int> v;
			auto it1 = s[a[x]].upper_bound(x);
			if(it1 != s[a[x]].end())
			{
				if(pre[*it1] == x) pre[*it1] = pre[x];
				else pre[*it1] = max(pre[*it1],pre[x]);
				v.emplace_back(*it1);
			}
			it1 = s[w - a[x]].upper_bound(x);
			auto it2 = s[a[x]].lower_bound(x);
			if(it1 != s[w - a[x]].end())
			{
				if(pre[*it1] == x)
				{
					if(it2 == s[a[x]].begin()) pre[*it1] = 0;
					else it2--,pre[*it1] = *it2;
				}
				else if(it2 != s[a[x]].begin()) it2--,pre[*it1] = max(pre[*it1],*it2);
				v.emplace_back(*it1);
			}
			it2 = s[a[x]].lower_bound(x);
			s[a[x]].erase(it2);
			a[x] = y;
			s[a[x]].insert(x);
			it1 = s[w - a[x]].lower_bound(x);
			if(it1 != s[w - a[x]].end())
			{
				if(w - a[x] == a[x])
				{
					it1++;
					if(it1 != s[w - a[x]].end()) pre[*it1] = max(pre[*it1],x),v.emplace_back(*it1);
					it1--;
				}
				else pre[*it1] = max(pre[*it1],x),v.emplace_back(*it1);
			}
			it2 = s[a[x]].upper_bound(x);
			if(it1 != s[w - a[x]].begin()) it1--,pre[x] = *it1,v.emplace_back(x),it1++;
			else pre[x] = 0,v.emplace_back(x);
			if(it1 != s[w - a[x]].begin() && it2 != s[a[x]].end() && pre[*it2] == *(--it1)) pre[*it2] = 0,v.emplace_back(*it2);
			for(int i = 0;i < v.size();i++) change(1,1,n,v[i]);
		}
		if(op == 2)
		{
			x ^= cnt,y ^= cnt;
			if(query(1,1,n,x,y) >= x)
			{
				cout << "Yes" << '\n';
				cnt++;
			}
			else cout << "No" << '\n';
		}
	}
	return 0;
}

回复

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

正在加载回复...