Cod sursa(job #12948)

Utilizator alex_damianDamian Alexandru alex_damian Data 5 februarie 2007 12:36:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>

#define FIN "datorii.in"
#define FOUT "datorii.out"
#define MAXN 15001

long long a[MAXN];
long n, m, i, j, x, y, cod;


void aduna(long ind, long x) {
	int poz = 0;
	while (ind <= n) {
    a[ind] += x;
    while (!(ind & (1<<poz))) poz++;
    ind += (1<<poz);
    poz++;
  }
}

void suma(long st, long dr) {
  int poz = 0;
  long long s1 = 0, s2 = 0;
  while (dr > 0) {
    s1 += a[dr];
    while (!(dr & (1<<poz))) poz++;
    dr -= (1<<poz);
    poz++;
  }
	st--;
  poz = 0;
  while (st > 0) {
    s2 += a[st];
    while (!(st & (1<<poz))) poz++;
    st -= (1<<poz);
    poz++;
  }
  printf("%lld\n", (s1-s2));
}


int main () {
	freopen(FIN, "r", stdin);
  freopen(FOUT, "w", stdout);
  scanf("%ld %ld", &n, &m);
  for (i=1; i<=n; i++) {
     scanf("%ld", &x);
     aduna(i, x);
  }
	for (i=1; i<=m; i++) {
     scanf("%ld %ld %ld", &cod, &x, &y);
     if (cod) suma(x, y);
     else aduna(x, -y);
  }
	return 0;
}