我的输出都比答案的输出少好多行,但是输出出来的那几行都是正确的,怀疑是哪里的边界判出了问题,实在是找不出来了,能不能有大佬帮忙看看啊 /kk
Code:
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define ri register int
const int N = 5e5 + 5, INF = 1e9;
inline int read() {
ri x = 0, f = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) f = (c == '-') ? -1 : 1;
for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return f * x;
}
stack<int> stk;
int n, m, a, b, c;
namespace FHQ_Treap {
struct Tree {
int val, dat, siz, ch[2];
int rev, tag, sum, maxx, lm, rm, cov;
} t[N];
int rt, tot;
#define ls(x) t[x].ch[0]
#define rs(x) t[x].ch[1]
inline int New(int val) {
int x;
if (stk.size()) {
x = stk.top();
stk.pop();
} else
x = ++tot;
t[x].sum = t[x].maxx = t[x].val = val;
ls(x) = rs(x) = 0;
t[x].lm = t[x].rm = max(0, val);
t[x].dat = rand(), t[x].siz = 1;
t[x].cov = -INF, t[x].tag = 0, t[x].rev = 0;
return x;
}
inline void push_up(int x) {
if (!x) return;
t[x].sum = t[x].val + t[ls(x)].sum + t[rs(x)].sum;
t[x].siz = t[ls(x)].siz + t[rs(x)].siz + 1;
t[x].maxx = max(max(t[ls(x)].maxx, t[rs(x)].maxx),
t[ls(x)].rm + t[x].val + t[rs(x)].lm);
t[x].lm = max(t[ls(x)].lm, t[ls(x)].sum + t[x].val + t[rs(x)].lm);
t[x].rm = max(t[rs(x)].rm, t[rs(x)].sum + t[x].val + t[ls(x)].rm);
if (ls(x)) t[x].maxx = max(t[x].maxx, t[ls(x)].maxx);
if (rs(x)) t[x].maxx = max(t[x].maxx, t[rs(x)].maxx);
}
inline void Reverse(int x) {
if (!x) return;
swap(ls(x), rs(x));
swap(t[x].lm, t[x].rm);
t[x].rev ^= 1;
}
inline void cover(int x, int val) {
t[x].val = t[x].cov = val;
t[x].tag = 1, t[x].sum = val * t[x].siz;
t[x].lm = t[x].rm = max(0, t[x].sum);
t[x].maxx = max(val, t[x].sum);
}
inline void push_down(int x) {
if (!x) return;
if (t[x].tag) {
if (ls(x)) cover(ls(x), t[x].cov);
if (rs(x)) cover(rs(x), t[x].cov);
t[x].tag = 0, t[x].rev = 0;
}
if (t[x].rev) {
if (ls(x)) Reverse(ls(x));
if (rs(x)) Reverse(rs(x));
t[x].rev ^= 1;
}
}
void remove(int x) {
if (!x) return;
stk.push(x);
if (ls(x)) remove(ls(x));
if (rs(x)) remove(rs(x));
}
void split_size(int x, int siz, int &a, int &b) {
if (!x || !siz) return a = 0, b = x, void();
push_down(x);
if (t[ls(x)].siz + 1 <= siz)
a = x, split_size(rs(x), siz - (t[ls(x)].siz + 1), rs(x), b);
else
b = x, split_size(ls(x), siz, a, ls(x));
push_up(x);
}
int merge(int x, int y) {
push_down(x), push_down(y);
if (!x || !y) return x | y;
if (t[x].dat < t[y].dat) {
rs(x) = merge(rs(x), y);
return push_up(x), x;
} else {
ls(y) = merge(x, ls(y));
return push_up(y), y;
}
}
} // namespace FHQ_Treap
using namespace FHQ_Treap;
namespace Debug {
inline void file() {
freopen("fuck.in.txt", "r", stdin);
freopen("aa.out", "w", stdout);
}
inline void dfs(int x) {
if (ls(x)) dfs(ls(x));
printf("%d ", t[x].val);
if (rs(x)) dfs(rs(x));
}
inline void debug() {
dfs(rt);
puts("");
}
#define _____ debug();
} // namespace Debug
using namespace Debug;
char op[15];
signed main() {
// file();
srand(time(0));
n = read(), m = read(), a = 0, b = 0, c = 0;
for (ri i = 1; i <= n; i++) rt = merge(rt, New(read()));
t[0].maxx = -INF;
// cout << rt << endl;
// _____
for (ri i = 1; i <= m; i++) {
scanf("%s", op + 1);
if (op[1] == 'I') {
int pos = read(), tot = read();
split_size(rt, pos, a, b);
for (ri i = 1; i <= tot; i++) a = merge(a, New(read()));
rt = merge(a, b);
// _____
} else if (op[1] == 'D') {
int pos = read(), tot = read();
split_size(rt, pos - 1, a, b);
split_size(b, tot, b, c);
remove(b);
merge(a, c);
// _____
} else if (op[1] == 'M' && op[3] == 'K') {
int pos = read(), tot = read(), k = read();
split_size(rt, pos - 1, a, b);
split_size(b, tot, b, c);
// change(b, k);
cover(b, k);
rt = merge(a, merge(b, c));
// _____
} else if (op[1] == 'R') {
int pos = read(), tot = read();
split_size(rt, pos - 1, a, b);
split_size(b, tot, b, c);
Reverse(b);
rt = merge(a, merge(b, c));
// _____
} else if (op[1] == 'G') {
int pos = read(), tot = read();
split_size(rt, pos - 1, a, b);
split_size(b, tot, b, c);
// push_up(b);
printf("%d\n", t[b].sum);
// dfs(b);
// puts("");
rt = merge(a, merge(b, c));
// _____
} else {
printf("%d\n", t[rt].maxx);
// puts("");
// printf("%d %d\n", t[rt].lm, t[rt].rm);
// _____
}
// cout << m << endl << endl << endl;
}
return 0;
}