#include <bits/stdc++.h>
#define int long long
#define ls(x) ((x) << 1)
#define rs(x) ((x) << 1 | 1)
using namespace std;
const int N = 1e6 + 10, mod = 1e9 + 7;
int n, m, w, a[N], cnt;
struct node {
int l, r, maxn;
};
node t[4 * N];
void push_up (int p) {
t[p].maxn = max(t[ls(p)].maxn, t[rs(p)].maxn);
return;
}
void build (int l, int r, int p) {
t[p].l = l, t[p].r = r;
if (l == r) {
return;
}
int mid = (l + r) >> 1;
build (l, mid, ls(p));
build (mid + 1, r, rs(p));
push_up(p);
return;
}
void update (int x, int p, int d) {
if (t[p].l == t[p].r) {
t[p].maxn = d;
return;
}
int mid = (t[p].l + t[p].r) >> 1;
if (x <= mid) update (x, ls(p), d);
if (x > mid) update (x, rs(p), d);
push_up(p);
return;
}
int query (int l, int r, int p) {
if (l <= t[p].l && t[p].r <= r) {
return t[p].maxn;
}
int mid = (t[p].l + t[p].r) >> 1, sum = 0;
if (l <= mid) sum = max(sum, query (l, r, ls(p)));
if (r > mid) sum = max(sum, query (l, r, rs(p)));
return sum;
}
set <int> s[N];
int qian (int x, int k) {
set <int> :: iterator it = s[k].lower_bound(x);
if (it == s[k].begin()) return 0;
return *( -- it);
}
int hou (int x, int k) {
set <int> :: iterator it = s[k].upper_bound(x);
if (it == s[k].end()) return n + 1;
return *it;
}
void upd (int x, int k) {
if (qian(x, k) > qian(x, w - k)) update (x, 1, 0);
else update (x, 1, qian(x, w - k));
int at = hou(x, a[x]);
s[a[x]].erase(x);
s[k].insert(x);
if (at <= n) {
if (qian(at, a[x]) > qian(at, w - a[x])) update (at, 1, 0);
else update (at, 1, qian(at, w - a[x]));
}
s[a[x]].insert(x);
s[k].erase(x);
at = hou(x, w - a[x]);
s[a[x]].erase(x);
s[k].insert(x);
if (at <= n) {
if (qian(at, w - a[x]) > qian(at, a[x])) update (at, 1, 0);
else update (at, 1, qian(at, a[x]));
}
a[x] = k;
at = hou(x, a[x]);
if (at <= n) {
if (qian(at, k) > qian(at, w - k)) update (at, 1, 0);
else update (at, 1, qian(at, w - k));
}
at = hou(x, w - a[x]);
if (at <= n) {
if (qian(at, w - k) > qian(at, k)) update (at, 1, 0);
else update (at, 1, qian(at, k));
}
return;
}
signed main() {
scanf("%lld%lld%lld", &n, &m, &w);
for (int i = 1; i <= n; ++ i ) scanf("%lld", a + i);
build (1, n, 1);
for (int i = 1; i <= n; ++ i ) {
if (s[w - a[i]].size()) {
update (i, 1, *s[w - a[i]].rbegin());
}
s[a[i]].insert(i);
}
while (m -- ) {
int op, l, r;
scanf("%lld%lld%lld", &op, &l, &r);
if (op == 1) {
upd (l, r);
} else {
l ^= cnt, r ^= cnt;
if (query (l, r, 1) >= l) {
++ cnt;
puts("Yes");
} else {
puts("No");
}
}
}
return 0;
}
Wa 了 #20 和 #30