蒟蒻敲了个差分zkw 结果炸得连渣都不剩
调了1h之后找不出问题 对着板子又调了1h还是不知道哪里的问题
自闭了 求救
#include<bits/stdc++.h>
#define il inline
#define ls i<<1
#define rs i<<1|1
using namespace std;
const int N = 100005;
int sum[N << 2], M;
il int read() {
int X = 0; bool flag = 1; char ch = getchar();
while(!isdigit(ch) && ch != 45) ch = getchar();
while(ch < 48 || ch > 57) { if(ch == 45) flag = 0; ch = getchar();}
while(ch >= 48 && ch <= 57) { X = (X << 1) + (X << 3) + ch - 48; ch = getchar(); }
if(flag) return X;
return ~(X - 1);
}
il void build(int n) {
for(M = 1; M <= n + 1; M <<= 1);
for(int i = M + 1; i <= M + n; ++i)
sum[i] = read();
for(int i = M - 1; i; --i)
sum[i] = min(sum[ls], sum[rs]), sum[ls] -= sum[i], sum[rs] -= sum[i];
}
il void update(int l, int r, int x) {
int d, s, t;
for(s = M + l - 1, t = M + r + 1; s ^ t ^ 1; s >>= 1, t >>= 1) {
if(~s & 1) sum[s ^ 1] += x;
if( t & 1) sum[t ^ 1] += x;
d = min(sum[s], sum[s ^ 1]), sum[s] -= d, sum[s ^ 1] -= d, sum[s >> 1] += d;
d = min(sum[t], sum[t ^ 1]), sum[t] -= d, sum[t ^ 1] -= d, sum[t >> 1] += d;
}
for(; s != 1; s >>= 1) d = min(sum[s], sum[s ^ 1]), sum[s] -= d, sum[s ^ 1] -= d, sum[s >> 1] += d;
}
il int query(int l, int r) {
int sans = 0, tans = 0, ans, s = M + l - 1, t = M + r + 1;
if(s != t) {
for(; s ^ t ^ 1; s >>= 1, t >>= 1) {
sans += sum[s], tans += sum[t];
if(~s & 1) sans += min(sans, sum[s ^ 1]);
if( t & 1) tans += min(tans, sum[t ^ 1]);
}
}
ans = min(sans + sum[s], tans + sum[t]);
while(s > 1) ans += sum[s >>= 1];
return ans;
}
signed main() {
int n = read(), m = read();
build(n);
while(m--) {
int opt = read(), l, r, x;
if(opt & 1) { l = read(), r = read(), x = read(); update(l, r, x); }
else { l = read(), r = read(); cout << query(l, r) << endl; }
}
return 0;
}