```cpp
inline int pre()
{
pushdown(rt);
if(son[rt][0] == 0) return -1;
int now = son[rt][0];
while(son[now][1] != 0)
now = son[now][1], pushdown(now);
return now;
}
inline int suf()
{
pushdown(rt);
if(son[rt][1] == 0) return -1;
int now = son[rt][1];
while(son[now][0] != 0)
now = son[now][0], pushdown(now);
return now;
}
inline int select(int loc)
{
int now = rt;
while(true)
{
pushdown(now);
if(size[son[now][0]] + 1 == loc) return now;
if(size[son[now][0]] + 1 > loc) now = son[now][0];
else
{
loc = loc - size[son[now][0]] - 1;
now = son[now][1];
}
}
}
inline void insert(int loc, int cnt)
{
splay(select(loc), 0);
int tmpsuf = suf();
if(tmpsuf == -1)
{
build(son[rt][1], 1, cnt, rt);
pushup(rt);
return ;
}
splay(tmpsuf, rt);
build(son[tmpsuf][0], 1, cnt, tmpsuf);
pushup(tmpsuf); pushup(rt);
}
inline void del(int loc, int cnt)
{
int now = get_loc(loc, loc+cnt-1);
int p = fa[now], which = get(now);
clear_tree(now);
son[p][which] = 0;
pushup(p);
pushup(rt);
}
inline void make_same(int loc, int cnt, int x)
{
int now = get_loc(loc, loc+cnt-1);
optc[now] = x;
sum[now] = size[now] * x; key[now] = x;
lmax[now] = rmax[now] = nowmax[now] = (x > 0) ? x * size[x] : 0;
pushdown(now);
}
inline void rever(int loc, int cnt)
{
int now = get_loc(loc, loc+cnt-1);
optr[now] ^= 1;
pushdown(now);
}
inline int get_sum(int loc, int cnt)
{
int now = get_loc(loc, loc+cnt-1);
return sum[now];
}
inline int max_sum() { return nowmax[rt]; }
inline void output(int o)
{
if(o == rt) pop = 0;
printf("now:%d, lson:%d, rson:%d\n", key[o], key[son[o][0]], key[son[o][1]]);
if(son[o][0] != 0) output(son[o][0]);
op[++pop] = key[o];
if(son[o][1] != 0) output(son[o][1]);
if(o == rt)
{
for(int i=1; i<=pop; i++)
printf("%d ", op[i]);
printf("\n");
}
}
inline void clear_tree(int o)
{
if(son[o][0] != 0) clear_tree(son[o][0]);
if(son[o][1] != 0) clear_tree(son[o][1]);
clear_node(o);
}
} st;
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++) scanf("%d", &a[i]);
st.clear();
st.build(st.rt, 1, n, 0);
st.pushup(st.rt);
for(int i=1; i<=m; i++)
{
/*printf("rt:%d\n", st.rt);
st.output(st.rt); printf("\n");*/
/*for(int i=1; i<=n*2; i++) printf("%d ", st.key[i]); printf("key\n");
for(int i=1; i<=n*2; i++) printf("%d ", st.son[i][0]); printf("lson\n");
for(int i=1; i<=n*2; i++) printf("%d ", st.son[i][1]); printf("rson\n");
for(int i=1; i<=n*2; i++) printf("%d ", st.size[i]); printf("size\n");
for(int i=1; i<=n*2; i++) printf("%d ", st.sum[i]); printf("sum\n");
for(int i=1; i<=n*2; i++) printf("%d ", st.nowmax[i]); printf("nowmax\n\n");*/
string str; int tmp1, tmp2;
cin>> str;
if(str[0] == 'G')
{
scanf("%d%d", &tmp1, &tmp2);
if(tmp2 == 0) { printf("0\n"); continue; }
printf("%d\n", st.get_sum(tmp1, tmp2));
}
if(str[0] == 'M' && str[2] == 'X') printf("%d\n", st.max_sum());
if(str[0] == 'I')
{
scanf("%d%d", &tmp1, &tmp2);
if(tmp2 == 0) continue;
for(int j=1; j<=tmp2; j++) scanf("%d", &a[j]);
st.insert(tmp1, tmp2);
}
if(str[0] == 'D')
{
scanf("%d%d", &tmp1, &tmp2);
if(tmp2 == 0) continue;
st.del(tmp1, tmp2);
}
if(str[0] == 'M' && str[2] == 'K')
{
int tmp3;
scanf("%d%d%d", &tmp1, &tmp2, &tmp3);
if(tmp2 == 0) continue;
st.make_same(tmp1, tmp2, tmp3);
}
if(str[0] == 'R')
{
scanf("%d%d", &tmp1, &tmp2);
if(tmp2 == 0) continue;
st.rever(tmp1, tmp2);
}
}
return 0;
}
```
by 魔塔哈奇 @ 2017-11-17 11:49:04
建议你这样查错:
找一份接口与你的代码相似的AC代码,把这份代码的各个部分分别“移植”到你的代码里,或是把你的部分代码移植到AC代码中,多提交几次并比对结果,这样可以比较有效的找出错因。
我在做这题的时候各种不明所以的RE,后来就是用这方法找到了错因。。。
希望对你有帮助~
by Running_Coder @ 2017-11-17 12:24:16