Link to this code:
https://cses.fi/paste/6807f75057156ab41189d28/#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define fast_io ios::sync_with_stdio(false); cin.tie(nullptr);
const int M = 1e9+7;
const int INF = 1e18;
const int N = 2e5+1;
vector<int> arr(N);
vector<int> sgmt(4*N);
vector<int> lazy(4*N);
int leftChild(int idx) {
return idx<<1;
}
int rightChild(int idx) {
return idx<<1 | 1;
}
void build(int s, int e, int idx){
if(s==e){
sgmt[idx] = arr[s];
return;
}
int mid = s+ (e-s)/2;
build(s,mid,leftChild(idx));
build(mid+1,e,rightChild(idx));
sgmt[idx] = sgmt[leftChild(idx)] + sgmt[rightChild(idx)];
}
void push(int s, int e, int idx){
if(s==e || lazy[idx]==0) return;
int mid = s + (e-s)/2;
int lele = mid - s + 1;
int rele = e - mid - 1 + 1;
sgmt[leftChild(idx)] += lazy[idx]*lele;
lazy[leftChild(idx)] += lazy[idx];
sgmt[rightChild(idx)] += lazy[idx]*rele;
lazy[rightChild(idx)] += lazy[idx];
lazy[idx] = 0;
}
void update(int s, int e, int idx, int l, int r, int delta){
if(r<s || e<l) return;
if(l<=s && e<=r){
sgmt[idx] += delta*(e-s+1);
lazy[idx] += delta;
return;
}
push(s,e,idx);
int mid = s + (e-s)/2;
update(s, mid, leftChild(idx), l, r, delta);
update(mid+1, e, rightChild(idx), l, r, delta);
sgmt[idx] = sgmt[leftChild(idx)] + sgmt[rightChild(idx)];
}
void query(int s, int e, int idx, int i){
if(s==e){
cout << sgmt[idx] << endl;
return;
}
int mid = s + (e-s)/2;
push(s,e,idx);
if(i<=mid){
query(s, mid, leftChild(idx), i);
}
else{
query(mid+1, e,rightChild(idx),i);
}
}
void solve(){
int n,q;cin>>n>>q;
for(int i=0;i<n;i++) cin>>arr[i];
build(0,n-1,1);
while(q--){
int o;
cin>>o;
if(o==2){
int i;cin>>i;
query(0,n-1,1,i-1);
}
else{
int l,r,d;cin>>l>>r>>d;
update(0,n-1,1,l-1,r-1,d);
}
}
}
int32_t main() {
fast_io;
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}