Cod sursa(job #395446)

Utilizator vicenzo_cnuStan Alexandru Dan vicenzo_cnu Data 13 februarie 2010 10:00:30
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<stdio.h>
#define Nmax 100005
int Maxarb[Nmax*4+66];
int n,m,maxim;

int max(int a,int b)
{
return a+b;

}

void init(int nod,int left,int right,int pos,int val)
{if(left==right)
  {Maxarb[nod]+=val;
   return;}
int div=(left+right)>>1;
 if(pos<=div) 
   init(2*nod,left,div,pos,val);
 else 
   init(2*nod+1,div+1,right,pos,val);
Maxarb[nod]=Maxarb[2*nod]+Maxarb[2*nod+1];
}
int inter(int nod,int left,int right,int start,int fin)
{if(start<=left && right<=fin)
  return Maxarb[nod];
 if(right<start) return 0;
 if(left>fin)	return 0; 
int div=(left+right)>>1,x=0,y=0;
if(start<=div) x=inter(2*nod,left,div,start,fin);
if(div<fin) y=inter(2*nod+1,div+1,right,start,fin);
return x+y;
}

int main()
{freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
scanf("%d %d",&n,&m);
int i,j,val;
for(i=1;i<=n;i++)
{scanf("%d",&val);

init(1,1,n,i,val);}
int x,y,z;
for(i=1;i<=m;i++)
{scanf("%d %d %d",&x,&y,&z);
if(x==1)
{

printf("%d\n",inter(1,1,n,y,z));}
else {init(1,1,n,y,-z);}

}
fclose(stdin);
fclose(stdout);
return 0;}