Cod sursa(job #472024)

Utilizator igsifvevc avb igsi Data 22 iulie 2010 16:14:07
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>

FILE *fin = fopen("datorii.in", "r");
FILE *fout = fopen("datorii.out", "w");

int datorie[ 30001];

void actualizareArbore ( int li, int ls, int poz, int val, int i )
{
	if ( li == ls )
	   datorie[i] += val;
	else
	{
		int mij = (li + ls) / 2;

		if( poz <= mij )
			actualizareArbore( li, mij, poz, val, 2*i );
		else
			actualizareArbore( mij + 1, ls, poz, val, 2*i+1 );

		datorie[i] = datorie[2*i] + datorie[2*i+1] ;
	}
}

int afisareDatorie ( int li, int ls, int a, int b, int i )
{
	int nr = 0;
	if ( a <= li && ls <= b)
		return datorie[i] ;
	else
	{
		if ( a <= ls && li != ls)
			nr = afisareDatorie( ((li + ls) / 2) + 1 , ls, a, b, 2*i+1 );
		if ( li <= b && li != ls)
			nr += afisareDatorie( li, (li + ls) / 2, a, b, 2*i );
	    return nr;
	}
}

int main()
{
	int n, m, op, t, v;

	fscanf (fin, "%d %d", &n, &m);

	for(int i = 1; i <= n; i++)
	{
		fscanf (fin, "%d", &v);
		actualizareArbore ( 1, n, i, v, 1) ;
	}

	for(int i = 1; i <= m ; i++)
	{
		fscanf( fin, "%d %d %d", &op, &t, &v);

		if ( op == 0 )
			actualizareArbore ( 1, n, t, -v, 1);
		else
		    fprintf( fout, "%d\n", afisareDatorie( 1, n, t, v, 1));
	}

	fclose(fin);
	fclose(fout);

	return 0;
}