Cod sursa(job #1816944)

Utilizator tgm000Tudor Mocioi tgm000 Data 27 noiembrie 2016 10:28:52
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<cstdio>
int v[15001];
int arb[60001];
void build(int nod,int st,int dr){
   if(st==dr){
      arb[nod]=v[st];
      return;
   }
   int mid=(st+dr)/2;
   build(2*nod,st,mid);
   build(2*nod+1,mid+1,dr);
   arb[nod]=arb[2*nod]+arb[2*nod+1];
}
void update(int nod,int st,int dr,int poz,int val){
   if(st==dr){
      arb[nod]=val;
      return;
   }
   int mid=(st+dr)/2;
   if(poz<=mid)
      update(2*nod,st,mid,poz,val);
   else
      update(2*nod+1,mid+1,dr,poz,val);
   arb[nod]=arb[2*nod]+arb[2*nod+1];
}
int query(int nod,int st,int dr,int l,int r){
   if(l<=st&&dr<=r)
      return arb[nod];
   int mid=(st+dr)/2;
   if(r<=mid)
      return query(2*nod,st,mid,l,r);
   if(l>mid)
      return query(2*nod+1,mid+1,dr,l,r);
   return query(2*nod,st,mid,l,r)+query(2*nod+1,mid+1,dr,l,r);
}
int main(){
   int n,m,i,o,a,b;
   freopen("datorii.in","r",stdin);
   freopen("datorii.out","w",stdout);
   scanf("%d%d",&n,&m);
   for(i=1;i<=n;i++)
      scanf("%d",&v[i]);
   build(1,1,n);
   for(i=1;i<=m;i++){
      scanf("%d%d%d",&o,&a,&b);
      if(o==0){
         v[a]-=b;
         update(1,1,n,a,v[a]);
      }else
         printf("%d\n",query(1,1,n,a,b));
   }
   return 0;
}