Cod sursa(job #197290)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 3 iulie 2008 11:31:57
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <stdlib.h>
#define fin "datorii.in"
#define fout "datorii.out"
#define N 15010
int pos,val,start,finish;
int sum;
int arb[5*N];
int n,m;
void update(int nod,int l,int r){
	int mid;
    if (l==r){
      arb[nod]-=val;
      return;
    }
	mid=(l+r)/2;
    if (pos<=mid)	update(2*nod,l,mid);
    else			update(2*nod+1,mid+1,r);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
}
void querry(int nod,int l,int r){
	int mid;
    if (start<=l && r<=finish){
        sum+=arb[nod];
        return;
    }
	mid=(l+r)/2;
    if (start<=mid)
      querry(2*nod,l,mid);
    if (mid<finish)
      querry(2*nod+1,mid+1,r);
}
int main(void){
	int i;
    int v[N],a,b,tip;
	freopen(fin,"r",stdin);
    freopen(fout,"w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;++i){
       scanf("%d",&v[i]);
       pos=i;
       val=-v[i];
       update(1,1,n);
    }
    for (i=1;i<=m;++i){
       scanf("%d%d%d",&tip,&a,&b);
       if (tip==1){
         sum=0;
         start=a;finish=b;
         querry(1,1,n);
         printf("%d\n",sum);
       }
       else if (tip==0){
         pos=a;
         val=b;
         update(1,1,n);
       }
    }
	return 0;
}