Submission #39363123
Source Code Expand
#include <bits/stdc++.h>
using i64 = long long;
constexpr int inf = 1E9 + 1;
template<class Info, class Tag>
struct LazySegmentTree {
const int n;
std::vector<Info> info;
std::vector<Tag> tag;
LazySegmentTree(int n) : n(n), info(4 << std::__lg(n)), tag(4 << std::__lg(n)) {}
LazySegmentTree(std::vector<Info> init) : LazySegmentTree(init.size()) {
std::function<void(int, int, int)> build = [&](int p, int l, int r) {
if (r - l == 1) {
info[p] = init[l];
return;
}
int m = (l + r) / 2;
build(2 * p, l, m);
build(2 * p + 1, m, r);
pull(p);
};
build(1, 0, n);
}
void pull(int p) {
info[p] = info[2 * p] + info[2 * p + 1];
}
void apply(int p, const Tag &v) {
info[p].apply(v);
tag[p].apply(v);
}
void push(int p) {
apply(2 * p, tag[p]);
apply(2 * p + 1, tag[p]);
tag[p] = Tag();
}
void modify(int p, int l, int r, int x, const Info &v) {
if (r - l == 1) {
info[p] = v;
return;
}
int m = (l + r) / 2;
push(p);
if (x < m) {
modify(2 * p, l, m, x, v);
} else {
modify(2 * p + 1, m, r, x, v);
}
pull(p);
}
void modify(int p, const Info &v) {
modify(1, 0, n, p, v);
}
Info rangeQuery(int p, int l, int r, int x, int y) {
if (l >= y || r <= x) {
return Info();
}
if (l >= x && r <= y) {
return info[p];
}
int m = (l + r) / 2;
push(p);
return rangeQuery(2 * p, l, m, x, y) + rangeQuery(2 * p + 1, m, r, x, y);
}
Info rangeQuery(int l, int r) {
return rangeQuery(1, 0, n, l, r);
}
void rangeApply(int p, int l, int r, int x, int y, const Tag &v) {
if (l >= y || r <= x) {
return;
}
if (l >= x && r <= y) {
apply(p, v);
return;
}
int m = (l + r) / 2;
push(p);
rangeApply(2 * p, l, m, x, y, v);
rangeApply(2 * p + 1, m, r, x, y, v);
pull(p);
}
void rangeApply(int l, int r, const Tag &v) {
return rangeApply(1, 0, n, l, r, v);
}
void maintainL(int p, int l, int r, int pre) {
if (info[p].difl > 0 && info[p].maxlowl < pre) {
return;
}
if (r - l == 1) {
info[p].max = info[p].maxlowl;
info[p].maxl = info[p].maxr = l;
info[p].maxlowl = info[p].maxlowr = -inf;
return;
}
int m = (l + r) / 2;
push(p);
maintainL(2 * p, l, m, pre);
pre = std::max(pre, info[2 * p].max);
maintainL(2 * p + 1, m, r, pre);
pull(p);
}
void maintainL() {
maintainL(1, 0, n, -1);
}
void maintainR(int p, int l, int r, int suf) {
if (info[p].difr > 0 && info[p].maxlowr < suf) {
return;
}
if (r - l == 1) {
info[p].max = info[p].maxlowl;
info[p].maxl = info[p].maxr = l;
info[p].maxlowl = info[p].maxlowr = -inf;
return;
}
int m = (l + r) / 2;
push(p);
maintainR(2 * p + 1, m, r, suf);
suf = std::max(suf, info[2 * p + 1].max);
maintainR(2 * p, l, m, suf);
pull(p);
}
void maintainR() {
maintainR(1, 0, n, -1);
}
};
struct Tag {
int add = 0;
void apply(Tag t) & {
add += t.add;
}
};
struct Info {
int max = -1;
int maxl = -1;
int maxr = -1;
int difl = inf;
int difr = inf;
int maxlowl = -inf;
int maxlowr = -inf;
void apply(Tag t) & {
if (max != -1) {
max += t.add;
}
difl += t.add;
difr += t.add;
}
};
Info operator+(Info a, Info b) {
Info c;
if (a.max > b.max) {
c.max = a.max;
c.maxl = a.maxl;
c.maxr = a.maxr;
} else if (a.max < b.max) {
c.max = b.max;
c.maxl = b.maxl;
c.maxr = b.maxr;
} else {
c.max = a.max;
c.maxl = a.maxl;
c.maxr = b.maxr;
}
c.difl = std::min(a.difl, b.difl);
c.difr = std::min(a.difr, b.difr);
if (a.max != -1) {
c.difl = std::min(c.difl, a.max - b.maxlowl);
}
if (b.max != -1) {
c.difr = std::min(c.difr, b.max - a.maxlowr);
}
if (a.max == -1) {
c.maxlowl = std::max(a.maxlowl, b.maxlowl);
} else {
c.maxlowl = a.maxlowl;
}
if (b.max == -1) {
c.maxlowr = std::max(a.maxlowr, b.maxlowr);
} else {
c.maxlowr = b.maxlowr;
}
return c;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int N, Q;
std::cin >> N >> Q;
std::vector<int> A(N);
for (int i = 0; i < N; i++) {
std::cin >> A[i];
}
auto pre = A, suf = A;
for (int i = 1; i < N; i++) {
pre[i] = std::max(pre[i], pre[i - 1]);
}
for (int i = N - 2; i >= 0; i--) {
suf[i] = std::max(suf[i], suf[i + 1]);
}
std::vector<Info> init(N);
for (int i = 0; i < N; i++) {
if (A[i] == pre[i] || A[i] == suf[i]) {
init[i].max = A[i];
init[i].maxl = init[i].maxr = i;
} else {
init[i].maxlowl = init[i].maxlowr = A[i];
}
}
LazySegmentTree<Info, Tag> seg(init);
for (int i = 0; i < Q; i++) {
int T, X;
std::cin >> T >> X;
if (T == 1) {
auto info = seg.rangeQuery(0, N);
seg.rangeApply(0, std::min(X, info.maxr + 1), {-1});
seg.maintainL();
} else if (T == 2) {
auto info = seg.rangeQuery(0, N);
seg.rangeApply(std::max(N - X, info.maxl), N, {-1});
seg.maintainR();
} else {
auto info = seg.rangeQuery(X - 1, X);
int ans = info.max == -1 ? info.maxlowl : info.max;
std::cout << ans << "\n";
}
}
return 0;
}
Submission Info
| Submission Time |
|
| Task |
E - 日本沈没 2 (Japan Sinks 2) |
| User |
jiangly |
| Language |
C++ (GCC 9.2.1) |
| Score |
100 |
| Code Size |
6393 Byte |
| Status |
AC |
| Exec Time |
368 ms |
| Memory |
55940 KiB |
Judge Result
| Set Name |
Sample |
Subtask1 |
Subtask2 |
Subtask3 |
Subtask4 |
All |
| Score / Max Score |
0 / 0 |
5 / 5 |
27 / 27 |
28 / 28 |
20 / 20 |
20 / 20 |
| Status |
|
|
|
|
|
|
| Set Name |
Test Cases |
| Sample |
sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt |
| Subtask1 |
01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt |
| Subtask2 |
02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 01-05.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 03-03.txt, 04-05.txt, 04-07.txt, 04-08.txt, 05-05.txt, sample-02.txt |
| Subtask3 |
03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, sample-01.txt |
| Subtask4 |
04-01.txt, 04-02.txt, 04-03.txt, 04-04.txt, 04-05.txt, 04-06.txt, 04-07.txt, 04-08.txt, 04-09.txt, 01-08.txt, 01-10.txt, sample-03.txt |
| All |
01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 04-01.txt, 04-02.txt, 04-03.txt, 04-04.txt, 04-05.txt, 04-06.txt, 04-07.txt, 04-08.txt, 04-09.txt, 05-01.txt, 05-02.txt, 05-03.txt, 05-04.txt, 05-05.txt, 05-06.txt, 05-07.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 01-01.txt |
AC |
8 ms |
3536 KiB |
| 01-02.txt |
AC |
3 ms |
3616 KiB |
| 01-03.txt |
AC |
4 ms |
3664 KiB |
| 01-04.txt |
AC |
5 ms |
3720 KiB |
| 01-05.txt |
AC |
2 ms |
3468 KiB |
| 01-06.txt |
AC |
2 ms |
3820 KiB |
| 01-07.txt |
AC |
5 ms |
3796 KiB |
| 01-08.txt |
AC |
4 ms |
3704 KiB |
| 01-09.txt |
AC |
5 ms |
3796 KiB |
| 01-10.txt |
AC |
5 ms |
3716 KiB |
| 02-01.txt |
AC |
103 ms |
30596 KiB |
| 02-02.txt |
AC |
75 ms |
18576 KiB |
| 02-03.txt |
AC |
230 ms |
55796 KiB |
| 02-04.txt |
AC |
368 ms |
55780 KiB |
| 02-05.txt |
AC |
45 ms |
3496 KiB |
| 02-06.txt |
AC |
71 ms |
55940 KiB |
| 02-07.txt |
AC |
199 ms |
55856 KiB |
| 02-08.txt |
AC |
237 ms |
55788 KiB |
| 02-09.txt |
AC |
273 ms |
55876 KiB |
| 03-01.txt |
AC |
190 ms |
33760 KiB |
| 03-02.txt |
AC |
253 ms |
55828 KiB |
| 03-03.txt |
AC |
44 ms |
3504 KiB |
| 03-04.txt |
AC |
61 ms |
55788 KiB |
| 04-01.txt |
AC |
35 ms |
6412 KiB |
| 04-02.txt |
AC |
212 ms |
28100 KiB |
| 04-03.txt |
AC |
248 ms |
55876 KiB |
| 04-04.txt |
AC |
315 ms |
55860 KiB |
| 04-05.txt |
AC |
50 ms |
3464 KiB |
| 04-06.txt |
AC |
71 ms |
55828 KiB |
| 04-07.txt |
AC |
182 ms |
55832 KiB |
| 04-08.txt |
AC |
235 ms |
55852 KiB |
| 04-09.txt |
AC |
265 ms |
55880 KiB |
| 05-01.txt |
AC |
52 ms |
31760 KiB |
| 05-02.txt |
AC |
63 ms |
3568 KiB |
| 05-03.txt |
AC |
252 ms |
55852 KiB |
| 05-04.txt |
AC |
319 ms |
55832 KiB |
| 05-05.txt |
AC |
44 ms |
3564 KiB |
| 05-06.txt |
AC |
72 ms |
55736 KiB |
| 05-07.txt |
AC |
291 ms |
55788 KiB |
| sample-01.txt |
AC |
6 ms |
3500 KiB |
| sample-02.txt |
AC |
2 ms |
3440 KiB |
| sample-03.txt |
AC |
2 ms |
3532 KiB |
| sample-04.txt |
AC |
2 ms |
3400 KiB |