写的不是很好,最后5分不知道错哪里,但网上题解有点少,给大家做参考。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, OUT = 1e9 + 10;
int n, m, K;
int ops[N], ids[N], ls[N], rs[N], xs[N], ps[N];
vector<int> nums;
int INF;
struct NODE{
int l, r;
int mx, mn, idtag;
int cnt, ctag;
int val, vtag;
}tr[(N * 6) << 2];
int find(int x){
return lower_bound(nums.begin(), nums.end(), x) - nums.begin() + 1;
}
void build(int u, int l, int r){
tr[u] = {l, r, -1e9, 1e9, 0, 0, -1, 0, OUT};
if (tr[u].l == tr[u].r) return;
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
}
void eval1(int u, int idtag){
tr[u].mx = idtag, tr[u].mn = idtag;
tr[u].idtag = idtag;
}
void eval2(int u, int ctag){
if (ctag) tr[u].cnt = tr[u].r - tr[u].l + 1;
else tr[u].cnt = 0;
tr[u].ctag = ctag;
}
void eval3(int u, int vtag){
tr[u].val = vtag;
tr[u].vtag = vtag;
}
void push_down(int u){
if (tr[u].idtag != 0){
eval1(u << 1, tr[u].idtag);
eval1(u << 1 | 1, tr[u].idtag);
tr[u].idtag = 0;
}
if (tr[u].ctag != -1){
eval2(u << 1, tr[u].ctag);
eval2(u << 1 | 1, tr[u].ctag);
tr[u].ctag = -1;
}
if (tr[u].vtag != OUT){
eval3(u << 1, tr[u].vtag);
eval3(u << 1 | 1, tr[u].vtag);
tr[u].vtag = OUT;
}
}
int search(int u, int l, int r, int id){
if (l <= tr[u].l && tr[u].r <= r){
if (tr[u].cnt == 0 || tr[u].mx == tr[u].mn && tr[u].mx == id) return tr[u].r;
if (tr[u].l == tr[u].r) return -1;
push_down(u);
int lres = search(u << 1, l, r, id);
if (lres != tr[u << 1].r) return lres;
int rres = search(u << 1 | 1, l, r, id);
if (rres != -1) return rres;
else return lres;
}
push_down(u);
int mid = tr[u].l + tr[u].r >> 1;
if (r <= mid){
return search(u << 1, l, r, id);
}
else if (l > mid){
return search(u << 1 | 1, l, r, id);
}
else{
int lres = search(u << 1, l, r, id);
if (lres != tr[u << 1].r) return lres;
int rres = search(u << 1 | 1, l, r, id);
if (rres != -1) return rres;
else return lres;
}
}
void push_up(NODE &root, const NODE &left, const NODE &right){
root.mx = max(left.mx, right.mx), root.mn = min(left.mn, right.mn);
root.cnt = left.cnt + right.cnt;
root.val = (left.val == right.val && left.val != OUT) ? left.val : OUT;
}
NODE query(int u, int l, int r){
if (l <= tr[u].l && tr[u].r <= r){
return tr[u];
}
push_down(u);
int mid = tr[u].l + tr[u].r >> 1;
if (r <= mid) return query(u << 1, l, r);
else if (l > mid) return query(u << 1 | 1, l, r);
else{
auto lt = query(u << 1, l, r), rt = query(u << 1 | 1, l, r);
NODE res;
push_up(res, lt, rt);
return res;
}
}
void modify(int u, int l, int r, int id, int flag, int val){
if (l <= tr[u].l && tr[u].r <= r){
if (id != 0) eval1(u, id);
if (flag != -1) eval2(u, flag);
if (val != OUT) eval3(u, val);
return;
}
push_down(u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) modify(u << 1, l, r, id, flag, val);
if (r > mid) modify(u << 1 | 1, l, r, id, flag, val);
push_up(tr[u], tr[u << 1], tr[u << 1 | 1]);
}
void add(int x){
if (x != 1) nums.push_back(x - 1);
nums.push_back(x);
if (x != m) nums.push_back(x + 1);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> K;
for (int i = 0; i < K; i ++ ){
cin >> ops[i];
if (ops[i] == 0){
cin >> ids[i] >> ls[i] >> rs[i] >> xs[i];
add(ls[i]), add(rs[i]);
}
else if (ops[i] == 1 || ops[i] == 2){
cin >> ids[i] >> ls[i] >> rs[i];
add(ls[i]), add(rs[i]);
}
else{
cin >> ps[i];
add(ps[i]);
}
}
sort(nums.begin(), nums.end());
nums.erase(unique(nums.begin(), nums.end()), nums.end());
INF = nums.size();
//
//for (auto t : nums) cout << t << ' ';
//cout << endl;
//cout << INF << endl;
//
build(1, 1, INF);
for (int i = 0; i < K; i ++ ){
int op = ops[i], id = ids[i], l = find(ls[i]), r = find(rs[i]), x = xs[i], p = find(ps[i]);
if (op == 0){
int rr = search(1, l, r, id);
if (rr != -1){
modify(1, l, rr, id, 1, x);
cout << nums[rr - 1] << endl;
}
else cout << -1 << endl;
}
else if (op == 1){
auto t = query(1, l, r);
if (t.cnt == r - l + 1 && t.mx == t.mn && t.mx == id){
modify(1, l, r, 0, 0, OUT);
cout << "OK" << endl;
}
else cout << "FAIL" << endl;
}
else if (op == 2){
auto t = query(1, l, r);
if (t.cnt == 0 && t.mx == t.mn && t.mx == id){
modify(1, l, r, 0, 1, OUT);
cout << "OK" << endl;
}
else cout << "FAIL" << endl;
}
else{
auto t = query(1, p, p);
if (t.cnt == 1) cout << t.mx << ' ' << t.val << endl;
else cout << 0 << ' ' << 0 << endl;
}
}
return 0;
}
/*
3 15 4
0 1 1 5 -1
0 2 10 13 2
0 1 4 14 6
1 1 2 8
3 15 12
0 1 1 5 -1
0 2 10 13 2
0 1 4 14 6
1 1 2 8
3 1
3 3
3 14
2 1 3 5
0 3 7 8 -4
2 1 6 8
1 3 6 7
0 2 5 7 3
*/
运行时间