Cod sursa(job #34863)

Utilizator lemneLemne Lemne lemne Data 21 martie 2007 16:02:18
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>

#define dim 15001

int N, T[dim<<1], A[dim];

long M;

void update( int, int, int, int, int );

long querry( int, int, int, int, int );

int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    
    scanf("%d %ld", &N, &M);

    long i;
    int day, value, c, a, b;
    
    for(i=1; i<=N; ++i)
    {
			 scanf("%d", A+i);
			 update(1, A[i], i, 1, N);
    }

    for(i=1; i<=M; ++i)
    {
             scanf("%d", &c);
             
             if( !c )
             {
				 scanf("%d %d", &day, &value);
				 A[day] -= value;
                 update(1, -value, day, 1, N);
             }
             
             else
             {
                 scanf("%d %d", &a, &b);
                 printf("%ld\n", querry(1, a, b, 1, N));
             }
    }
    
    fclose(stdin);
    fclose(stdout);
    
    return 0;
}

void update( int v, int value, int day, int l, int r )
{
	 if( l != r )
	 {
	 	T[v] += value;

		int m = (l+r) >> 1;

		if( day <= m )
			update(v<<1, value, day, l, m);

		if( day > m )
			update((v<<1)+1, value, day, m+1, r);
	 }
}

long querry( int v, int a, int b, int l, int r )
{
	 long t = 0; int m;

	 if( l >= a && r <= b )
	 {
		if( l == r )
			t += A[l];
		else
		    t += T[v];

        return t;
	 }

	 else
	 {
		 m = (l+r) >> 1;

		 if( a <= m )
			t += querry(v<<1, a, b, l, m);

		 if( b > m )
			t += querry((v<<1)+1, a, b, m+1, r);

		 return t;
	 }
}