很久之前的考场代码,现在都没过,写的动态开点,马蜂优良求助
#include <bits/stdc++.h>
#define rep(i, x, y) for (int i = x; i <= y; ++i)
#define drep(i, x, y) for (int i = x; i >= y; --i)
#define ll long long
#define pb push_back
#define It set<tree>::iterator
#define endl '\n'
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define int ll
using namespace std;
const int N = 700050, V = 500000;
namespace ae86{
const int bufl=1<<15;
char buf[bufl],*s=buf,*t=buf;
inline int fetch(){
if(s==t){t=(s=buf)+fread(buf,1,bufl,stdin);if(s==t)return EOF;}
return*s++;
// return getchar();
}
inline int read(){
int a=0,b=1,c=fetch();
while(!isdigit(c))b^=c=='-',c=fetch();
while(isdigit(c))a=a*10+c-48,c=fetch();
return b?a:-a;
}
}
using ae86::read;
struct node {
int l1, r1, l2, r2;
} l[N];
inline bool cmp(node x, node y) { return x.l2 < y.l2; }
unordered_map<int, int> rt;
int tot, s[N * 20][2], tag[N * 20], mi[N * 20];
inline void Up(int & p) { if(!p) p = ++tot; }
struct tree {
int l, r;
mutable int v;
};
bool operator <(const tree &x, const tree &y){ return x.l<y.l; }
set<tree> tr;
It split(int pos){
It it = tr.lower_bound({pos, -1, 0});
if(it != tr.end() && it->l == pos) return it;
--it;
int l = it->l, r = it->r, v = it->v;
tr.erase(it);
tr.insert({l, pos - 1, v});
return tr.insert({pos, r, v}).first;
}
void emerge(int l,int r,int x){
It itr = split(r + 1), itl = split(l);
tr.erase(itl, itr);
tr.insert({l, r, x});
}
int n, m, k, q;
inline void Add(int &p, int l, int r, int x) {
if(!p) p = ++tot;
mi[p] += x;
tag[p] += x;
}
inline void down(int p, int l, int r) {
if(l == r || tag[p] == 0) return;
int mid = l + r >> 1;
Add(s[p][0], l, mid, tag[p]);
Add(s[p][1], mid + 1, r, tag[p]);
tag[p] = 0;
}
void upd(int ql, int qr, int x, int p, int l = 1, int r = m) {
down(p, l, r);
if(ql <= l && r <= qr) {
tag[p] += x;
mi[p] += x;
return;
}
if(qr < l || r < ql) return;
int mid = l + r >> 1;
Up(s[p][0]), Up(s[p][1]);
// cout << "min : " << "p : " << p << " " << l << ' ' << r << " = " << mi[p] << endl;
upd(ql, qr, x, s[p][0], l, mid), upd(ql, qr, x, s[p][1], mid + 1, r);
mi[p] = min(mi[s[p][0]], mi[s[p][1]]);
}
bool qry(int ql, int qr, int p, int l = 1, int r = m) {
down(p, l, r);
if(!p) return 1;
if(ql <= l && r <= qr) {
// cout << "qry min : " << l << " " << r << " " << mi[p] << endl;
if(mi[p] == 0) return 0;
return 1;
}
if(qr < l || r < ql) return 1;
int mid = l + r >> 1;
Up(s[p][0]), Up(s[p][1]);
return qry(ql, qr, s[p][0], l, mid) & qry(ql, qr, s[p][1], mid + 1, r);
}
void update(int p, int l, int r, int x) {
if(!rt.count(p)) rt[p] = ++tot;
upd(l, r, x, rt[p]);
}
inline int Qry(int p, int l, int r) {
// cout << "S : root : \n";
// for(auto u : rt) cout << u.first << ' ' << u.second << endl;
int R = rt[p];
// cout << "R : " << R << endl;
if(!R) return 0;
// cout << "Queryed\n";
// cout << "-----------\n";
return qry(l, r, R);
}
unordered_map<int, int> f, F;
int jump(int x, int i) {
if(!i) return x;
if(l[i].l2 <= x && l[i].r2 >= x) {
if(l[i].l2 - l[i].l1 >= l[i].r2 - l[i].l2 + 1) x = l[i].l1 + (x - l[i].l2);
else x -= (x - l[i].l2) / (l[i].l2 - l[i].l1) * (l[i].l2 - l[i].l1);
if(x >= l[i].l2) x -= (l[i].l2 - l[i].l1);
} else if(l[i].l2 < x) return x;
return jump(x, i - 1);
}
inline int getfa(int x) {
return jump(x, k);
}
int P[N], L[N], R[N];
signed main() {
n = read(), m = read(), k = read(), q = read();
// tree yzq;
// yzq.l = 1, yzq.r = n, yzq.v = 0;
// tr.insert(yzq);
rep(i, 1, k) l[i].l1 = read(), l[i].r1 = read(), l[i].l2 = read(), l[i].r2 = read();
sort(l + 1, l + 1 + k, cmp);
// rep(i, 1, k) {
// emerge(l[i].l2, l[i].r2, i);
// }
// rep(i, 1, n) {
// It x = split(i);
// cout << x->v << endl;
// }
// rep(i, 1, n) cout << "fa : " << i << " = " << getfa(i) << endl;
int idx = 0;
rep(i, 1, q) {
int op;
op = read();
if(op == 1) {
int p, l, r;
p = read(), l = read(), r = read();
int fa = getfa(p);
// cout << "Update : " << fa << endl;
update(fa, l, r, 1);
P[i] = fa, L[i] = l, R[i] = r;
} else {
if(op == 2) {
int p;
p = read();
assert(P[p]);
update(P[p], L[p], R[p], -1);
} else {
int p, l, r;
p = read(), l = read(), r = read();
int fa = getfa(p), Q = Qry(fa, l, r);
// cout << "Query : " << fa << endl;
assert(fa);
assert(l <= r && l && r);
++idx;
puts(Q ? "Yes" : "No");
}
}
}
return 0;
}