Cod sursa(job #184442)

Utilizator amadaeusLucian Boca amadaeus Data 23 aprilie 2008 17:38:05
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>

#define NX (1<<15)
using namespace std;

typedef long long ll;

ll S[ NX ];
int a[ NX ], N, M, X, Y, val;

void build( int n, int l, int r ) {
	if( l==r ) {
		S[n] = a[l];
		return;
	}
	int m = (l+r)>>1;
	build( n<<1, l, m );
	build( (n<<1)+1, m+1, r );
	S[n] = S[n<<1] + S[(n<<1)+1];
}

void upd( int n, int l, int r ) {
	S[n] -= val;

	if( l==r )
		return;

	int m = (l+r)>>1;
	
	if( X <= m )
		upd( n<<1, l, m );
	else
		upd( (n<<1)+1, m+1, r );
}

ll que( int n, int l, int r ) {
	if( X<=l && r<=Y )
		return S[n];
		
	int m = (l+r)>>1;
 	ll s = 0;

	if( X <= m )
		s += que( n<<1, l, m );
	if( m < Y )
		s += que( (n<<1)+1, m+1, r );
	return s;
}

void cit() {
	int i, j, op;
	
	scanf( "%d%d", &N, &M );

	for( i = 1; i <= N; i++ )
		scanf( "%d", a+i );

	build( 1, 1, N );

	while( M-- ) {
		scanf( "%d %d %d ", &op, &i, &j );
		if( op == 0 ) {
			val = j, X = i;
			upd( 1, 1, N );
		}
		else {
			X = i, Y = j;
			printf( "%lld\n", que( 1, 1, N ) );
		}
	}
}

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

	cit();

	return 0;
}