Cod sursa(job #763223)

Utilizator harababurelPuscas Sergiu harababurel Data 1 iulie 2012 14:27:56
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <iostream>
#include <fstream>
using namespace std;

int n, m, aib[15005];

void modifica(int poz, int val, char semn) {
	int i=poz;
	while(i<=n) {
		if(semn=='+') aib[i]+=val;	//ca sa nu folosesc o functie de adunat si una de scazut
		if(semn=='-') aib[i]-=val;	//folosesc una singura care primeste ca parametru si operatia efectuata
		i += (i & -i);
	}
}

int compute(int poz) {
	int rez=0, i=poz;
	
	while(i>0) {
		rez+=aib[i];
		i -= (i & -i);
	}
	return rez;
}
	

int main() {
	
	ifstream f("datorii.in");
	ofstream g("datorii.out");
	
	int i, j, op, a, b;
	
	f>>n>>m;
	for(i=1; i<=n; i++) aib[i]=0;	//initializare
	for(i=1; i<=n; i++) {
		f>>j;
		modifica(i, j, '+'); 	//pe poz. i se pune valoarea j
	}
	
	for(int t=1; t<=m; t++) {
		f>>op>>a>>b;
		
		if(op==0) modifica(a, b, '-');			//s-a achitat plata -> trebuie scazut din arbore
		else g<<compute(b)-compute(a-1)<<"\n";	//se cere suma din intervalul [a,b]
		
	}
		

	f.close();
	g.close();
	return 0;
}