Cod sursa(job #818)

Utilizator Spike7d5Spike7d5 Spike7d5 Data 11 decembrie 2006 20:51:36
Problema Datorii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 0.87 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 v[0][l];

int c=(r>>n)<<n;
if (l==c) return v[n][l>>n];
return suma (l, c-1, n-1) + suma (c, 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--;
    j=c-b+1;
    if (j&(j-1)==0) j=log2(j); else j=log2(j)-1;
    printf ("%d\n", suma (b, c, j)); } }

return 0; }