Cod sursa(job #528896)

Utilizator feelshiftFeelshift feelshift Data 3 februarie 2011 19:08:03
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
// http://infoarena.ro/problema/datorii
// rezolvata cu arbori indexati binar (http://infoarena.ro/aib)
#include <fstream>
using namespace std;

#define maxDays 15002
#define zeros(x) ( (x ^ (x - 1)) & x )

ifstream in("datorii.in");
ofstream out("datorii.out");

int lenght;
int AIB[maxDays];

void add(int location,int value);	// aduna la pozitia location valoarea value
int query(int right);	// returneaza suma elementelor subsecventei [1,right];

int main() {
	int nrOperations,value;
	int first,second;
	bool interogation;

	in >> lenght >> nrOperations;

	for(int currentDay=1;currentDay<=lenght;currentDay++) {
		in >> value;
		add(currentDay,value);
	}

	for(int i=1;i<=nrOperations;i++) {
		in >> interogation >> first >> second;

		if(interogation)
			out << query(second) - query(first-1) << "\n";	// suma elementelor din intervalul [first,second]
		else
			add(first,-second);
	}

	in.close();
	out.close();

	return (0);
}

void add(int location,int value) {
	for(int k=location;k<=lenght;k=k+zeros(k))
		AIB[k] = AIB[k] + value;
}

int query(int right) {
	int value = 0;

	for(int k=right;k>0;k=k-zeros(k))
		value = value + AIB[k];

	return value;
}