Cod sursa(job #472061)

Utilizator igsifvevc avb igsi Data 22 iulie 2010 19:40:39
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
//arbori indexati binar
#include <stdio.h>

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

int datorie[ 15001 ];

int main()
{
	int n, m, op, t, v;
	fscanf(fin, "%d %d", &n, &m);

	for (int i = 1; i <= n; i++)
	{
		int x = i, val;
		fscanf(fin, "%d", &val);

		while( x <= n)
		{
			datorie[x] += val; 
			x += ( x ^ (x - 1)) & x ;
		}
	}

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

		while ( op == 0 && t <= n )
		{
				datorie[t] -= v;
				t += ( t ^ (t - 1)) & t;
		}
		
		if ( op == 1 )
		{
			int suma = 0, sumb = 0;
			t--;
			while ( t )
			{
				suma += datorie[t];
				t -= (t ^ (t - 1)) & t;
			}

			while ( v )
			{
				sumb += datorie[v];
				v -= (v ^ (v - 1)) & v;
			}

			fprintf( fout, "%d\n", sumb - suma );
		}
	}

	fclose(fout);
	fclose(fin);
	return 0;
}