Cod sursa(job #1068521)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 28 decembrie 2013 14:04:10
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<fstream>
#define M ((l+r)/2)


using namespace std;
const int maxn = 15020;
int a[maxn],h[maxn*2],n,m;

 void create(int l=1,int r=n, int nod =1){
 	if(l==r){
 		h[nod]=a[l];return;
 	}
 //	int m = (l+r)/2;
 	create(l,M,2*nod);
 	create(M+1,r,nod*2+1);
 	h[nod]=h[nod*2]+h[nod*2+1];
 }
 
 void update(int pos,int v,int l=1,int r=n, int nod=1){
 	if(r==l){
 		h[nod]-=v;return;
 	}
 //int	m =(l+r)/2;
 	if(pos <= M) update(pos,v,l,M,nod*2);
 	else update(pos,v,M+1,r,nod*2+1);
 	h[nod]=h[nod*2]+h[nod*2+1];
 }
 
int fmax(int a,int b,int l=1,int r=n,int nod=1){
 	if (a>r || b<l )return 0;
 	if(a<=l && b>=r)return h[nod];
 //int	m =(l+r)/2;
 	return fmax(a,b,l,M,nod*2)+fmax(a,b,M+1,r,nod*2+1);
 }

main(){
   freopen("datorii.in","r",stdin);
   freopen("datorii.out","w",stdout);
  
  int x,y,z,i;
scanf("%d %d",&n,&m);
  for(i=1;i<=n;i++)scanf("%d",&a[i]);
  
  create();
//  for(i=1;i<=n;i++)printf("%d ",a[i]);
//  printf("\n");
 // for(i=1;i<=n*2-1;i++)printf("%d ",h[i]);
  
  
  
 for(i=1;i<=m;i++){
 	scanf("%d %d %d",&x,&y,&z);
 	if(x==1){ 	
 		printf("%d\n",fmax(y,z));
 	}else{ 			
 		update(y,z);
 	}
 }
 
 
 
    
  
  
}