Cod sursa(job #1341157)

Utilizator BLz0rDospra Cristian BLz0r Data 12 februarie 2015 15:24:32
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <cstdio>
using namespace std;

#define Nmax ( 1 << 14 ) + 1
#define LSB(x) ( x & ( -x ) )

FILE *f = fopen ( "datorii.in", "r" );
FILE *g = fopen ( "datorii.out", "w" );

int aib[Nmax], aibSize = 1;

void Adauga ( int poz, int val ){
	
	for ( int i = poz; i <= aibSize; i += LSB(i) )
		aib[i] += val;
}

void Plateste ( int poz, int val ){
	
	for ( int i = poz; i <= aibSize; i += LSB(i) )
		aib[i] -= val;
}

int Sum ( int x ){
	int s = 0;
	
	while ( x ){
		s += aib[x];
		x -= LSB(x);
	}
	return s;
}

int Query ( int st, int dr ){
	
	return Sum ( dr ) - Sum ( st - 1 );
}

int main(){
	int N, M, x, a, b;
	
	fscanf ( f, "%d%d", &N,&M );
	
	while ( aibSize < N )
		aibSize *= 2;
	
	for ( int i = 1; i <= N; ++i ){
		fscanf ( f, "%d", &x );
		Adauga ( i, x );
	}
	
	for ( int i = 1; i <= M; ++i ){
		fscanf ( f, "%d%d%d", &x, &a, &b );
		
		if ( x == 0 )
			Plateste ( a, b );
		else
			fprintf ( g, "%d\n", Query ( a , b ) );
	}
	
	return 0;
}