代码如下:
//#pragma GCC optimize(3)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<memory.h>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<ctime>
#include<iomanip>
#define mod 998244353
#define maxn 100005
using namespace std;
int l[4*maxn],r[4*maxn];
int lc[4*maxn],rc[4*maxn];
int delta[4*maxn],sum[4*maxn];
int cnt=1;
int n,m;
int arr[maxn];
int opt;
int lleft,rright,k,d;
int p;
int figure(int x){
return sum[x]+(r[x]-l[x]+1)*delta[x];
}
void build(int x,int left,int right){
// cout<<x<<" "<<left<<" "<<right<<endl;
l[x]=left;
r[x]=right;
sum[x]=delta[x]=0;
if(left==right){
return;
}
int mid=(left+right)>>1;
lc[x]=cnt++;
build(lc[x],left,mid);
rc[x]=cnt++;
build(rc[x],mid+1,right);
sum[x]=figure(lc[x])+figure(rc[x]);
}
void change(int x,int left,int right,int val){
// cout<<x<<" "<<l[x]<<" "<<r[x]<<" ";
if(left<=l[x]&&r[x]<=right){
delta[x]+=val;
// cout<<"plus "<<val<<",now "<<delta[x]<<endl;
return;
}
// cout<<"down!"<<endl;
int mid=(l[x]+r[x])>>1;
if(left<=mid){
change(lc[x],left,right,val);
}
if(right>mid){
change(rc[x],left,right,val);
}
sum[x]=figure(lc[x])+figure(rc[x]);
}
int query(int x,int left,int right){
//cout<<x<<" "<<l[x]<<" "<<r[x]<<" ";
if(left<=l[x]&&r[x]<=right){
// cout<<"return "<<figure(x)<<endl;
return figure(x);
}
// cout<<"down"<<endl;
delta[lc[x]]+=delta[x];
delta[rc[x]]+=delta[x];
delta[x]=0;
sum[x]=figure(lc[x])+figure(rc[x]);
int mid=(l[x]+r[x])>>1,lre=0;
if(left<=mid){
lre+=query(lc[x],left,right);
}
if(right>mid){
lre+=query(rc[x],left,right);
}
sum[x]=figure(lc[x])+figure(rc[x]);
return lre;
}
void post(int x){
// cout<<x<<" "<<l[x]<<" "<<r[x]<<" "<<delta[x]<<" "<<sum[x]<<" "<<figure(x)<<endl;
if(lc[x]){
post(lc[x]);
post(rc[x]);
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
build(0,1,n);
//post(0);
while(m--){
cin>>opt;
if(opt==1){
cin>>lleft>>rright>>k>>d;
if(lleft==rright){
change(0,lleft,lleft,k);
change(0,lleft+1,lleft+1,(-1)*k);
}else{
change(0,lleft,lleft,k);
// cout<<"END!"<<endl;
change(0,lleft+1,rright,d);
// cout<<"END!"<<endl;
change(0,rright+1,rright+1,(-1)*k-(rright-lleft)*d);
// cout<<"END!"<<endl;
}
}else{
cin>>p;
cout<<query(0,1,p)+arr[p]<<endl;
}
// post(0);
}
return 0;
}