Cod sursa(job #566014)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 28 martie 2011 16:14:03
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<fstream>

using namespace std;

int A[1<<14+8], N, M;

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

void insert(int nod, int st, int dr, int poz, int val) {
	if(st==dr) {
		A[nod]+=val;
		return;
	}
	int mij=(st+dr)/2;
	if(poz<=mij) 
		insert(2*nod,st,mij,poz,val);
	else
		insert(2*nod+1,mij+1,dr,poz,val);
	A[nod]+=val;
}

void update(int nod, int st, int dr, int poz, int val) {
	if(st==dr) {
		A[nod]-=val;
		return;
	}
	int mij=(st+dr)/2;
	if(poz<=mij) 
		update(2*nod,st,mij,poz,val);
	else
		update(2*nod+1,mij+1,dr,poz,val);
	A[nod]=A[2*nod]+A[2*nod+1];
}

void query(int nod, int st, int dr, int left, int right, int &cost) {
	if(left<=st && dr<=right) {
		cost+=A[nod];
		return;
	}
	int mij=(st+dr)/2;
	if(left<=mij)
		query(2*nod,st,mij,left,right,cost);
	if(right>mij)
		query(2*nod+1,mij+1,dr,left,right,cost);
}

int main() {
	int i, val, poz, left, right, cost, op;
	
	f>>N>>M;
	for(i=1; i<=N; i++) {
		f>>val;
		insert(1,1,N,i,val);
	}
	while(M--) {
		f>>op;
		if(!op) {
			f>>poz>>val;
			update(1,1,N,poz,val);
		}
		else {
			cost=0;
			f>>left>>right;
			query(1,1,N,left,right,cost);
			g<<cost<<"\n";
		}
	}
	
	f.close(); g.close();
	
	return 0;
}