求助,玄关
  • 板块P6617 查找 Search
  • 楼主xz001
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/11 14:01
  • 上次更新2024/7/11 15:11:11
查看原帖
求助,玄关
674967
xz001楼主2024/7/11 14:01
#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

2024/7/11 14:01
加载中...