比赛 |
树形数据结构拔高 |
评测结果 |
WWWWWWWWWW |
题目名称 |
聪聪的世界 |
最终得分 |
0 |
用户昵称 |
健康铀 |
运行时间 |
8.671 s |
代码语言 |
C++ |
内存使用 |
31.54 MiB |
提交时间 |
2025-04-17 19:52:50 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int MX = 1e6 + 10;
struct N {
int l, r;
int mn, mx;
int lz;
} t[4 * MX];
int a[MX];
void pd(int nd) {
if (t[nd].lz != 0 && t[nd].l != t[nd].r) {
int d = t[nd].lz;
t[2*nd].mn += d;
t[2*nd].mx += d;
t[2*nd].lz += d;
t[2*nd+1].mn += d;
t[2*nd+1].mx += d;
t[2*nd+1].lz += d;
t[nd].lz = 0;
}
}
void bd(int nd, int l, int r) {
t[nd].l = l;
t[nd].r = r;
t[nd].lz = 0;
if (l == r) {
t[nd].mn = a[l];
t[nd].mx = a[l];
return;
}
int m = (l + r) / 2;
bd(2*nd, l, m);
bd(2*nd+1, m+1, r);
t[nd].mn = min(t[2*nd].mn, t[2*nd+1].mn);
t[nd].mx = max(t[2*nd].mx, t[2*nd+1].mx);
}
void ur(int nd, int l, int r, int d) {
if (t[nd].r < l || t[nd].l > r) return;
if (l <= t[nd].l && t[nd].r <= r) {
t[nd].mn += d;
t[nd].mx += d;
t[nd].lz += d;
return;
}
pd(nd);
ur(2*nd, l, r, d);
ur(2*nd+1, l, r, d);
t[nd].mn = min(t[2*nd].mn, t[2*nd+1].mn);
t[nd].mx = max(t[2*nd].mx, t[2*nd+1].mx);
}
int qp(int nd, int p) {
if (t[nd].l == t[nd].r) {
return t[nd].mn;
}
pd(nd);
int m = (t[nd].l + t[nd].r) / 2;
if (p <= m) {
return qp(2*nd, p);
} else {
return qp(2*nd+1, p);
}
}
void up(int nd, int p, int v) {
if (t[nd].l == t[nd].r) {
t[nd].mn = v;
t[nd].mx = v;
return;
}
pd(nd);
int m = (t[nd].l + t[nd].r) / 2;
if (p <= m) {
up(2*nd, p, v);
} else {
up(2*nd+1, p, v);
}
t[nd].mn = min(t[2*nd].mn, t[2*nd+1].mn);
t[nd].mx = max(t[2*nd].mx, t[2*nd+1].mx);
}
int qml(int nd, int l, int r, int v) {
if (t[nd].r < l || t[nd].l > r) return -1;
pd(nd);
if (t[nd].mn >= v) return -1;
if (t[nd].l == t[nd].r) {
return t[nd].l;
}
int rr = qml(2*nd+1, l, r, v);
if (rr != -1) return rr;
return qml(2*nd, l, r, v);
}
int qmg(int nd, int l, int r, int v) {
if (t[nd].r < l || t[nd].l > r) return -1;
pd(nd);
if (t[nd].mx <= v) return -1;
if (t[nd].l == t[nd].r) {
return t[nd].l;
}
int rr = qmg(2*nd+1, l, r, v);
if (rr != -1) return rr;
return qmg(2*nd, l, r, v);
}
int qnl(int nd, int l, int r, int v) {
if (t[nd].r < l || t[nd].l > r) return -1;
pd(nd);
if (t[nd].mn >= v) return -1;
if (t[nd].l == t[nd].r) {
return t[nd].l;
}
int lr = qnl(2*nd, l, r, v);
if (lr != -1) return lr;
return qnl(2*nd+1, l, r, v);
}
int qng(int nd, int l, int r, int v) {
if (t[nd].r < l || t[nd].l > r) return -1;
pd(nd);
if (t[nd].mx <= v) return -1;
if (t[nd].l == t[nd].r) {
return t[nd].l;
}
int lr = qng(2*nd, l, r, v);
if (lr != -1) return lr;
return qng(2*nd+1, l, r, v);
}
int main() {
freopen("ccsworld.in", "r", stdin);
freopen("ccsworld.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
bd(1, 1, n);
while (m--) {
int op, x, y, w;
scanf("%d", &op);
if (op >= 1 && op <= 4) {
scanf("%d", &x);
int vx = qp(1, x);
int p = -1;
if (op == 1) {
if (x > 1) {
p = qml(1, 1, x-1, vx);
}
} else if (op == 2) {
if (x > 1) {
p = qmg(1, 1, x-1, vx);
}
} else if (op == 3) {
if (x < n) {
p = qnl(1, x+1, n, vx);
}
} else {
if (x < n) {
p = qng(1, x+1, n, vx);
}
}
if (p == -1) {
printf("-1\n");
} else {
printf("%d\n", qp(1, p));
}
} else if (op == 5) {
scanf("%d%d", &x, &y);
if (x == y) continue;
int vx = qp(1, x);
int vy = qp(1, y);
up(1, x, vy);
up(1, y, vx);
} else if (op == 6 || op == 7) {
scanf("%d%d%d", &x, &y, &w);
if (op == 7) {
w = -w;
}
ur(1, x, y, w);
}
}
return 0;
}