动态开点 WA on #15求调
查看原帖
动态开点 WA on #15求调
842460
Sanyueyetu楼主2024/7/25 13:24

rt

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1000000000000000001;
ll minz[8000010], mino[8000010];
int ls[8000010], rs[8000010], root;
int tag2[8000010], tot;
bool tag1[8000010];
//tag2为1表示全部赋值为1,tag2为2表示全部赋值为0
void add_tag(int x, ll l, ll r, int sum) {
	if (sum == 1) {
		tag1[x] = 0;
		tag2[x] = 1;
		minz[x] = N, mino[x] = l;
	}
	if (sum == 2) {
		tag1[x] = 0;
		tag2[x] = 2;
		minz[x] = l, mino[x] = N;
	}
	if (sum == 3) {
		tag1[x] = 1 - tag1[x];
		swap(minz[x], mino[x]);
	}
}
void push_down(int x, ll l, ll r) {
	ll mid = l + r >> 1;
	if (ls[x] == 0) {
		ls[x] = ++tot;
		minz[ls[x]] = l, mino[ls[x]] = N;
	}
	if (rs[x] == 0) {
		rs[x] = ++tot;
		minz[rs[x]] = mid + 1, mino[rs[x]] = N;
	}
	if (tag2[x]) {
		add_tag(ls[x], l, mid, tag2[x]);
		add_tag(rs[x], mid + 1, r, tag2[x]);
	}
	if (tag1[x]) {
		add_tag(ls[x], l, mid, 3);
		add_tag(rs[x], mid + 1, r, 3);
	}
	tag2[x]=tag1[x]=0;
}
void insert(int &rt, ll l, ll r, ll L, ll R, int sum) {
	if (rt == 0) {
		rt = ++tot;
		minz[rt] = l, mino[rt] = N;
	}
	if (L <= l && r <= R) {
		add_tag(rt, l, r, sum);
		return;
	}
	push_down(rt, l, r);
	ll mid = l + r >> 1;
	if (L <= mid) insert(ls[rt], l, mid, L, R, sum);
	if (mid < R) insert(rs[rt], mid + 1, r, L, R, sum);
	minz[rt] = min(minz[ls[rt]], minz[rs[rt]]);
	mino[rt] = min(mino[ls[rt]], mino[rs[rt]]);
}
int op, n;
ll a,b;
signed main() {
	scanf("%d", &n);
	while (n--) {
		scanf("%d%lld%lld", &op, &a, &b);
		insert(root, 1, 1e18, a, b, op);
		printf("%lld\n", minz[1]);
	}
}
2024/7/25 13:24
加载中...