Cod sursa(job #934)

Utilizator Spike7d5Spike7d5 Spike7d5 Data 12 decembrie 2006 09:42:49
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>

int v[15][15005];

int log2 (int x) {
int log=0, p=1;
while (p<x) { p<<=1; log++; }
return log; }


int suma (int l, int r, int n) {
if (l>r) return 0;
if (l==r) return v[0][l];

int c=(r>>n)<<n;
if (l==c && l+(1<<n)-1==r) return v[n][l>>n];
c=(r>>(n-1))<<(n-1);
if (l<c)
  return suma (l, c-1, n-1) + suma (c, r, n-1);
else
  return suma (l, r, n-1);
}


int main() {
int n, m, i, j, a, b, c, x;

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

scanf ("%d%d", &n, &m);
for (i=0;i<n;i++) scanf ("%d", &v[0][i]);
x=log2(n);
for (i=n;i<1<<x;i++) v[0][i]=0;
for (i=1;i<=x;i++)
  for (j=0;j<=(n>>i);j++)
    v[i][j]=v[i-1][2*j]+v[i-1][2*j+1];

for (i=0;i<m;i++) {
  scanf ("%d%d%d", &a, &b, &c);
  if (a==0) {
    b--;
    for (j=0;j<=x;j++)
      v[j][b>>j]-=c; }
  else {
    b--; c--;
    if (b==c)
      printf ("%d\n", v[0][b]);
    else {
      j=log2(c-b+1);
      a=(c>>j)<<j;
      if (b<=a-1)
	printf ("%d\n", suma (b, a-1, j) + suma(a, c, j));
      else
	printf ("%d\n", suma (b, c, j));  } } }

return 0; }