Cod sursa(job #221005)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 13 noiembrie 2008 23:27:43
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.12 kb
//v3 - cu arbori de intervale (storsi)

#include <stdio.h>

long arbore[150000]; //nodul n are fiii 2n, 2n+1
long a[15000], n, m;
long op, t, v;

//functie de construit arborele (recursiva)
long arb(long nod, long st, long dr);

//functie de interogat arborele (recursiva)
long suma(long nod, long st, long dr, long sti, long dri);

//functie de actualizat arborele (recursiva)
void scade(long nod, long st, long dr, long t, long v);

//si in sfarsit ...
int main (void)
{
	int i;

	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);

	scanf("%ld%ld", &n, &m);

	for(i=0; i<n; i++)
		scanf("%ld", &a[i]);

	//crestem copacu' ...
	arb(1, 0, n-1);

	//... si apoi il scuturam
	for(i=0; i<m; i++)
	{
		scanf("%ld%ld%ld", &op, &t, &v);

		if(op)
			printf("%ld\n", suma(1, 0, n-1, t-1, v-1));
		else
			scade(1, 0, n-1, t-1, v);
	}

	//gata. noah binie?
	return 0;
}

//============================================

//functie de construit arborele (recursiva)
long arb(long nod, long st, long dr)
{
	long s1 = 0, s2 = 0, mij;

	if(st==dr)
	{
      arbore[nod] = a[st];
	}
	else
	{
		mij = (st+dr) >> 1;

		if(st<=mij)
			s1 = arb(nod<<1, st, mij);

		if(mij<dr)
			s2 = arb(nod*2+1, mij+1, dr);

		arbore[nod] = s1 + s2;
	}

	return arbore[nod];
}
//--------------------------------------------

//functie de interogat arborele (recursiva)
long suma(long nod, long st, long dr, long sti, long dri)
{
	long mij;

	if(st==sti && dr==dri)
		return arbore[nod];

	mij = (st+dr) >> 1;
	if(dri<=mij)
		return suma(nod<<1, st, mij, sti, dri);

	if(sti>mij)
		return suma(nod*2+1, mij+1, dr, sti, dri);

	return suma(nod<<1, st, mij, sti, mij) + suma(nod*2+1, mij+1, dr, mij+1, dri);
}
//--------------------------------------------

//functie de actualizat arborele (recursiva)
void scade(long nod, long st, long dr, long t, long v)
{
	long mij;

	arbore[nod] -= v;

	if(st!=dr)
	{
		mij = (st+dr) >> 1;
		if(t<=mij)
			scade(nod<<1, st, mij, t, v);
		else
			scade(nod*2+1, mij+1, dr, t, v);
	}
}
//--------------------------------------------