Cod sursa(job #828270)

Utilizator vladm97Matei Vlad vladm97 Data 3 decembrie 2012 15:59:46
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<fstream>
using namespace std;
#define lmax 50000
int arbint[lmax];
int start,finish,val,poz,s,op;

int suma(int a, int b){
	return(a+b);}

void actualizare(int nod,int st,int dr){
	if(st==dr){
		if(op==1)
			arbint[nod]=val;
		else 
			arbint[nod]=arbint[nod]-val;}//se actualizeaza astfel arborele in zilele in care clientii isi platesc din datorii
		else{
		int div=(st+dr)/2;
		if(poz<=div)actualizare(2*nod,st,div);
		else actualizare(2*nod+1,div+1,dr);
		arbint[nod]=suma(arbint[2*nod],arbint[2*nod+1]);
	}
}
void interogare(int nod, int st, int dr){
	if(start<=st && dr<=finish){s+=arbint[nod];}
	else{
		int div=(st+dr)/2;
		if(start<=div)interogare(2*nod,st,div);
		if(div<finish)interogare(2*nod+1,div+1,dr);
	}
}
int main(){
	int a,b,i,n,m,x;
	ifstream f("datorii.in");
	ofstream g("datorii.out");
	f>>n>>m;
	op=1;
	for(i=1;i<=n;i++){
		f>>x;
		poz=i;
		val=x;
		actualizare(1,1,n);}
	op=0;
	for(i=1;i<=m;i++){
		f>>x>>a>>b;
		if(x==0){poz=a;
			val=b;
			actualizare(1,1,n);}
		else{
			s=0;
			start=a;
			finish=b;
			interogare(1,1,n);
			g<<s<<'\n';}
	}
		f.close();
		g.close();}