Cod sursa(job #469198)

Utilizator nashnash mit nash Data 6 iulie 2010 20:58:41
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <cstdio>

using namespace std;

#define ZEROS(x) ( (x) & (-x) )

int aib[15001],vec[15001];
int nr , n , m , o , p;

void update(int p , int nr ) {
	
	vec[ p ] += nr;
	
	if( vec[ p ] < 0 )
		nr += vec[ p ] , vec[ p ] = 0;
	aib[ p ] += nr;
	
	for( int i = p + ZEROS(p) ; i <= n ; i += ZEROS(i) )
		aib[ i ] += nr;
}

int query(int a, int b) {
	
	int sum = 0;
	
	for( int i = b ; i >= a ; )
		if( i - ZEROS(i) + 1 >= a )
			sum += aib[ i ] , i -= ZEROS(i);
		else 
			sum += vec[ i ] , i--;
	
	return sum;
}

int main() {
	
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for(int i = 1 ; i <= n ; i++ ) {
		scanf("%d",&nr);
		update( i , nr );
	}
	
	for(int i = 1 ; i <= m ; i++ ) {
		scanf("%d %d %d", &o, &p, &nr);
		if( o == 0 ) update( p , -nr );
		if( o == 1 ) printf("%d\n", query( p , nr ) );
	}
	
	return 0;
}