/*
10 7
12 58 98 2 17 81 88 15 58 88
1 8
2 8 100
1 8
3 1 10
3 5 8
4 5 8 1000
3 5 8
*/ 
#include<iostream>
using namespace std;

struct Node{
  int l,r,w,f;
}tr[400100];

int n,m;

void down(int k){
  tr[2*k].f+=tr[k].f;
  tr[2*k+1].f+=tr[k].f;
  tr[2*k].w+=tr[k].f*(tr[2*k].r-tr[2*k].l+1);
  tr[2*k+1].w+=tr[k].f*(tr[2*k+1].r-tr[2*k+1].l+1);
  tr[k].f=0;
}

void build(int k,int ll,int rr){
  int mid;
  tr[k].l=ll;
  tr[k].r=rr;
  if(tr[k].l==tr[k].r){
    cin>>tr[k].w;
    return;
  }
  mid=(tr[k].l+tr[k].r)/2;
  build(2*k,ll,mid);
  build(2*k+1,mid+1,rr);
  tr[k].w=tr[2*k].w+tr[2*k+1].w;
}

int ap(int k,int x){
  if(tr[k].l==tr[k].r){
    return tr[k].w;
  }
  if( tr[k].f>0 ){down(k);}
  int mid=(tr[k].l+tr[k].r)/2;
  if( x<=mid ){return ap( 2*k, x );}
  else{ return ap(2*k+1,x);}
}

void cp(int k,int x,int add){
  if(tr[k].l==tr[k].r){
    tr[k].w+=add;
    return;
  }
  if( tr[k].f>0 ){down(k);}
  int mid=(tr[k].l+tr[k].r)/2;
  if( x<=mid ){cp(2*k,x,add);}
  else{ cp(2*k+1,x,add);}
  tr[k].w=tr[2*k].w+tr[2*k+1].w;
}

int ai(int k,int x,int y){
  int ans=0;
  if(x<=tr[k].l && y>=tr[k].r ){
    return tr[k].w;
  }
  if( tr[k].f>0 ){down(k);}
  int mid=(tr[k].l+tr[k].r)/2;
  if(x<=mid){ ans+=ai( 2*k,x,y ); }
  if(y>mid){ ans+=ai( 2*k+1,x,y ); }
  return ans;
} 

void ci(int k,int x,int y,int add){
  if(x<=tr[k].l && y>=tr[k].r ){
  	tr[k].w+=add*(tr[k].r-tr[k].l+1 );
  	tr[k].f+=add;
    return;
  }
  if( tr[k].f>0 ){down(k);}
  int mid=(tr[k].l+tr[k].r)/2;
  if(x<=mid){ ci( 2*k,x,y,add ); }
  if(y>mid){ ci( 2*k+1,x,y,add ); }
  tr[k].w=tr[2*k].w+tr[2*k+1].w;
}

int main(){
  int ml,cs1,cs2,cs3,cs4;	
  cin>>n>>m;	
  build(1,1,n);  
  for(int i=1;i<=m;i++){
    cin>>ml;
    if(ml==1){cin>>cs1;cout<<ap(1,cs1)<<"\n";}
    if(ml==2){cin>>cs1>>cs2;cp(1,cs1,cs2);}
    if(ml==3){cin>>cs1>>cs2;cout<<ai(1,cs1,cs2)<<"\n";}
    if(ml==4){cin>>cs1>>cs2>>cs3;ci(1,cs1,cs2,cs3);}
  }
  return 0;
}





0 条评论

目前还没有评论...