线段树爆0求调,样例输出
4
12
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int tree[N<<2], a[N<<2], tag[N<<2], n, m;
int ls(int x) {return x*2;}
int rs(int x) {return x*2+1;}
void push_up(int x){
tree[x] = tree[ls(x)] + tree[rs(x)];
}
void add_tag(int rt, int l, int r, int d){
tag[rt] += d;
tree[rt] += d * (r-l+1);
}
void push_down(int rt, int l, int r){
if(tag[rt]){
int mid = (l+r)>>1;
add_tag(ls(rt), l, mid, tag[rt]);
add_tag(rs(rt), mid+1, r, tag[rt]);
tag[rt]=0;
}
}
void update(int rt, int L, int R, int l, int r, int d){
if(L<=l && r<=R){
add_tag(rt, l, r, d);
return ;
}
int mid = (l+r)>>1;
push_down(rt, l, r);
if(L <= mid) update(ls(rt), L, R, l, mid, d);
if(R > mid) update(rs(rt), L, R, mid+1, r, d);
push_up(rt);
}
int query(int rt, int L, int R, int l, int r){
int ret=0;
if(l>=L && r<=R) return tree[rt];
push_down(rt, l, r);
int mid = (l+r)>>1;
if(L<=mid) ret += query(ls(l), L, R, l, mid);
if(R>mid) ret += query(rs(r), L, R, mid+1, r);
return ret;
}
void build(int rt, int l, int r){
tag[rt]=0;
if(l==r){
cin>>tree[rt];
return ;
}
int mid = (l+r)>>1;
build(rs(rt), l, mid);
build(ls(rt), mid+1, r);
push_up(rt);
}
int search(int rt, int l, int r, int p){
if (p == l && r == p){
return tree[rt];
}
int mid = (l + r) >> 1;
int sum = 0;
push_down(rt, l, r);
if (L <= mid){
sum += search(ls(rt), l, mid, p);
} else {
sum += search(rs(rt), mid + 1, r, p);
}
push_up(rt);
return sum;
}
int main(){
cin>>n>>m;
build(1, 1, n);
while(m--){
int op, x, y, k;
cin>>op;
if(op==1){
cin>>x>>y>>k;
update(1, x, y, 1, n, k);
} else {
cin>>x;
// cout<<x<<'\n';
cout<<search(1, 1, n, x)<<'\n';
}
}
}