运行不了,挂了
#include <iostream>
#define lc u << 1
#define rc u << 1 | 1
using namespace std;
const int MAXN = 2 * 1e5 + 5;
int n, f;
int x[MAXN];
struct Tree{
int l, r, sum, add;
}t[MAXN * 4];
void pushup(int u){
t[u].sum = t[lc].sum + t[rc].sum;
return;
}
void pushdown(int u){
if(t[u].add){
t[lc].add += t[u].add;
t[rc].add += t[u].add;
t[lc].sum += t[u].add * (t[lc].r - t[lc].l + 1);
t[rc].sum += t[u].add * (t[rc].r - t[rc].l + 1);
t[u].add = 0;
}
return;
}
void build(int u, int l, int r){
t[u] = {l, r, 0, 0};
if(l == r){
t[u].sum = x[l];
return;
}
int mid = (l & r) + ((l ^ r) >> 1);
build(lc, l, mid);
build(rc, mid + 1, r);
pushup(u);
return;
}
void change(int u, int l, int r, int k){
if(l <= t[u].l && t[u].r <= r) {
t[u].sum += k * (t[u].r - t[u].l + 1);
t[u].add += k;
return;
}
pushdown(u);
int mid = (l & r) + ((l ^ r) >> 1);
if(l <= mid){
change(lc, l, r, k);
}
if(r > mid){
change(rc, l, r, k);
}
pushup(u);
return;
}
int query(int u, int l, int r){
if(l <= t[u].l && t[u].r <= r){
return t[u].sum;
}
pushdown(u);
int sum = 0;
int mid = (l & r) + ((l ^ r) >> 1);
if(l <= mid){
sum += query(lc, l, r);
}
if(r > mid){
sum += query(rc, l, r);
}
return sum;
}
int main(){
cin >> n >> f;
for(int i = 1;i <= n;i ++){
cin >> x[i];
}
build(1, 1, n);
while(f --){
int op;
int l, r, k;
cin >> op;
if(op == 1){
cin >> l >> r >> k;
change(1, l, r, k);
}
else if(op == 2){
cin >> k;
change(1, 1, 1, k);
}
else if(op == 3){
cin >> k;
change(1, 1, 1, -k);
}
else if(op == 4){
cin >> l >> r;
cout << query(1, l, r) << "\n";
}
else{
cout << query(1, 1, 1) << "\n";
}
}
}