fhq板子疑问
查看原帖
fhq板子疑问
963559
Lu_xZ楼主2024/7/11 01:26

以下代码不加我注释所指的一句可以ac

加了样例都过不了

具体来说出现了1的父亲是5,5的父亲是1的情况

但我都清空了啊/yiw

#include<bits/stdc++.h>
#define eb emplace_back
#define ep emplace
using namespace std;

using ll = long long;
constexpr int N = 4e5 + 5;

mt19937 rnd(3284);

struct Node {
	int val, key, sz, l, r, p, tag;
	void addtag(int x) {
		val = tag = x;
	}
	void init(int x) {
		l = r = p = tag = 0;
		sz = 1, val = x;
		
		key = rnd();			// <-- 
		
	}
} t[N];
int rt, idx, T1, T2, T3, T4;
int New(int v) {
	t[++ idx] = {v, rnd(), 1};
	return idx;
}
void pushup(int x) {
	int l = t[x].l, r = t[x].r;
	t[x].sz = t[l].sz + t[r].sz + 1;
	t[l].p = t[r].p = x;
}
void pushdown(int x) {
	if(t[x].tag) {
		t[t[x].l].addtag(t[x].tag);
		t[t[x].r].addtag(t[x].tag);
		t[x].tag = 0;
	}
} 
void split(int x, int v, int& L, int &R) {
	if(!x) {
		return void(L = R = 0);
	}
	pushdown(x);
	if(t[x].val <= v) {
		L = x;
		split(t[x].r, v, t[x].r, R);
	}
	else {
		R = x;
		split(t[x].l, v, L, t[x].l);
	}
	pushup(x);
}
int merge(int x, int y) {
	if(!x || !y) return x + y;
	if(t[x].key < t[y].key) {
		pushdown(x);
		t[x].r = merge(t[x].r, y), pushup(x);
		return x;
	}
	pushdown(y);
	t[y].l = merge(x, t[y].l), pushup(y);
	return y;
}
int n, m;
void update(int x) {
	if(t[x].p) update(t[x].p);
	pushdown(x);
}
int rnk(int x) {
	update(x);
	int k = t[t[x].l].sz + 1;
	while(t[x].p) {
		if(t[t[x].p].r == x) {
			k += t[t[t[x].p].l].sz + 1;
		}
		x = t[x].p;
	}
	return k;
}
void k_split(int x, int k, int& L, int &R) {
	if(!x) return void(L = R = 0);
	pushdown(x);
	int u = t[t[x].l].sz + 1;
	if(u <= k) {
		L = x;
		k_split(t[x].r, k - u, t[x].r, R);
	}
	else {
		R = x;
		k_split(t[x].l, k, L, t[x].l);
	}
	pushup(x);
}

int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin >> n;
	for(int i = 1; i <= n; ++ i) {
		int x; cin >> x;
		split(rt, x, T1, T2);
		rt = merge(merge(T1, New(x)), T2);
	}
	cin >> m;
	while(m --) {
		int op; cin >> op;
		if(op == 1) {
			int x, v; cin >> x >> v;
			k_split(rt, rnk(x) - 1, T1, T2);
			k_split(T2, 1, T2, T3);
			t[x].init(v);
			rt = merge(T1, T3);
			split(rt, v, T1, T2);
			rt = merge(merge(T1, x), T2);
		}
		if(op == 2) {
			int x; cin >> x;
			update(x);
			cout << t[x].val << '\n';
		}
		if(op == 3) {
			int l, r; cin >> l >> r;
			int m = l + r >> 1;
			split(rt, l - 1, T1, T2);
			split(T2, m, T2, T3);
			if(T2) t[T2].addtag(l - 1);
			split(T3, r, T3, T4);	
			if(T3) t[T3].addtag(r + 1);
			rt = merge(merge(merge(T1, T2), T3), T4);
		}
	}
	return 0;
}
2024/7/11 01:26
加载中...