Cod sursa(job #41241)

Utilizator Bluedrop_demonPandia Gheorghe Bluedrop_demon Data 28 martie 2007 03:48:31
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
// Problema datorii

#include <stdio.h>
#define MAX       15001

int A[MAX];
long b[MAX];
int n;

int query(int x)
{
    int r = 0;
    for (; x; x -= (x ^ (x-1)) & x)
        r += b[x];
    return r;
} 

void update(int x, int v)
{
      for (; x <= n; x += (x^(x-1)) & x)
          b[x] += v;
}

int main()
{
    freopen( "datorii.in", "rt", stdin );
    long m;
        scanf( "%d %ld", &n, &m );
    int i, j, k;
        b[0] = 0;
        for( i=1; i<=n; i++ )
              scanf( "%d ", &A[i] );
              
        b[1] = A[1];
        for( i=2; i<=n; i++ )
             {
                  j = i;
                  k = 0;
                  while( j%2 == 0 ) { k++; j = j>>1; }
                  j = 1;
                  while( k ) { j = j<<1; k--; }
                  for( k=i-j+1; k<=i; k++ )
                       b[i] +=  A[k];
             }
             
    freopen( "datorii.out" , "wt", stdout );
    int c, p, q;
             while( m > 0 )
             {
                    m--;
                    scanf( "%d %d %d", &c, &p, &q );
                    if( c == 0 ) update( p, q );
                        else
                        printf( "%d\n", query(q)-query(p-1) );
             }                    

    fclose( stdin );
    fclose( stdout );
    return 0;
    
}