社区讨论
求条,只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 条回复,欢迎继续交流。
正在加载回复...