Cod sursa(job #469188)

Utilizator nashnash mit nash Data 6 iulie 2010 20:13:21
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 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 p) {
	
	int sum = 0;
	
	for( int i = p ; i > 0 ; i -= ZEROS(i) )
		sum += aib[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);
		vec[i] = 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(nr) - query(p-1) );
	}
	
	return 0;
}