
懶標線段樹
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define f first
#define s second
#define fastio ios_base::sync_with_stdio(0);cin.tie(0)
using namespace std;
//declare
const int maxn = 2e5+5;
int n,q;
vector<int> v;
struct seg{
int L,R;
int data;
int lson, rson;
int chg;
int real(){
return data + chg;
}
} ST[2*maxn];
int stptr = 1;
//
void push(int idx){
ST[idx].data = ST[idx].real();
int lson = ST[idx].lson, rson = ST[idx].rson;
ST[lson].chg += ST[idx].chg;
ST[rson].chg += ST[idx].chg;
ST[idx].chg = 0;
}
void build(int L,int R,int idx){
ST[idx].L = L, ST[idx].R = R;
if(L+1 == R){
ST[idx].data = v[L];
return;
}
int mid = (ST[idx].L + ST[idx].R) / 2;
int lson = ST[idx].lson = stptr++;
int rson = ST[idx].rson = stptr++;
build(L,mid,lson); build(mid,R,rson);
ST[idx].data = ST[lson].data + ST[rson].data;
}
void modify(int L,int R,int x,int idx){
if(ST[idx].L == L && ST[idx].R == R){
ST[idx].chg += x;
return;
}
push(idx);
int mid = (ST[idx].L + ST[idx].R) / 2;
int lson = ST[idx].lson, rson = ST[idx].rson;
if(R <= mid) modify(L,R,x,lson);
else if(L >= mid) modify(L,R,x,rson);
else modify(L,mid,x,lson), modify(mid,R,x,rson);
ST[idx].data = ST[lson].data + ST[rson].data;
}
int query(int L,int R,int idx){
if(ST[idx].L == L && ST[idx].R == R){
return ST[idx].real();
}
push(idx);
int mid = (ST[idx].L + ST[idx].R) / 2;
int lson = ST[idx].lson, rson = ST[idx].rson;
if(R <= mid) return query(L,R,lson);
else if(L >= mid) return query(L,R,rson);
else return query(L,mid,lson) + query(mid,R,rson);
}
signed main(){
fastio;
cin>>n>>q;
for(int i=0;i<n;i++){
int x; cin>>x;
v.push_back(x);
}
build(0,n,0);
while(q--){
int op,a,b,c; cin>>op;
if(op == 1){
cin>>a>>b>>c; a--;
modify(a,b,c,0);
}
if(op == 2){
cin>>a; a--;
cout<<query(a,a+1,0)<<"\n";
}
}
return 0;
}

發佈留言