Cod sursa(job #595412)

Utilizator Smaug-Andrei C. Smaug- Data 12 iunie 2011 15:17:31
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>

#define MAXN 15000

int T[4*MAXN+10];

int Update(int node, int l, int r, int a, int b, int v){
  if(a<=l && r<=b){
    T[node]+=v;
    return v;
  }
  else {
    int mid=((r-l)>>1)+l, x=0, y=0;
    if(a<=mid)
      x=Update(node<<1, l, mid, a, b, v);
    if(b>mid)
      y=Update((node<<1)+1, mid+1, r, a, b, v);
    T[node]=T[node]+x+y;
    return x+y;
  }
}

int Query(int node, int l, int r, int a, int b){
  if(a<=l && r<=b)
    return T[node];
  else {
    int mid=((r-l)>>1)+l, x=0, y=0;
    if(a<=mid)
      x=Query(node<<1, l, mid, a, b);
    if(b>mid)
      y=Query((node<<1)+1, mid+1, r, a, b);
    return x+y;
  }
}

int main(){

  freopen("datorii.in", "r", stdin);
  freopen("datorii.out", "w", stdout);

  int N, M, i, a, b, c;
  
  scanf("%d%d", &N, &M);

  for(i=1; i<=N; i++){
    scanf("%d", &a);
    Update(1, 1, N, i, i, a);
  }

  for(i=0; i<M; i++){
    scanf("%d%d%d", &c, &a, &b);
    if(!c)
      Update(1, 1, N, a, a, -b);
    else
      printf("%d\n", Query(1, 1, N, a, b));
  }

  return 0;

}