Cod sursa(job #365453)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 18 noiembrie 2009 19:41:29
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>
#define infile "datorii.in"
#define outfile "datorii.out"
#define nmax 100001
int arb[nmax]; //valorile nodurilor arborelui de intervale
int poz; //pozitia din sirul initial la care se modifica o valoare
int val; //valoarea care se scade de la pozitia poz
int a,b; //intervalul in care trebuie calculata suma

void update(int rad, int st, int dr)
{
	if(st==dr) { arb[rad]+=val; return; } //adaugam valoarea la arbore
	int mij=(st+dr)>>1; //jumatatea intervalului
	if(poz<=mij) update(rad<<1,st,mij); //nodul se afla in partea stanga
	if(mij<poz) update((rad<<1)|1,mij+1,dr); //nodul se afla in partea dreapta
	arb[rad]=arb[rad<<1]+arb[(rad<<1)|1];
}

int query(int rad, int st, int dr)
{
	if(a<=st && dr<=b) return arb[rad]; //daca avem un interval complet
	int mij=(st+dr)>>1; //jumatatea intervalului
	int val=0; //valoarea pe acest subarbore
	if(a<=mij) val+=query(rad<<1,st,mij); //partea stanga
	if(mij<b) val+=query((rad<<1)|1,mij+1,dr); //partea dreapta
	return val; //returnam valoarea
}

int main()
{
	int n,m,x;
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	scanf("%d %d\n",&n,&m);
	
	//valorile initiale
	for(poz=1;poz<=n;poz++)
	{
		scanf("%d",&val);
		update(1,1,n);
	}
	
	//cele m operatii
	while(m--)
	{
		scanf("%d",&x); //tipul operatiei
		if(x)
		{ //daca avem query
			scanf("%d %d\n",&a,&b);
			printf("%d\n",query(1,1,n));
		}
		else
		{ //daca avem update
			scanf("%d %d\n",&poz,&val);
			val*=(-1);
			update(1,1,n);
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}