Cod sursa(job #294790)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 2 aprilie 2009 19:30:33
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>
#define zeros(x) ((x ^ (x - 1)) & x)

int n, sum;
int aib[15010];

void solve();
void update(int, int);
void query(int, int);

int main()
{
	solve();
	return 0;
}

void update(int pos, int val)
{
	int i;
	for (i = pos; i <= n; i += zeros(i))
	{
		aib[i] += val;
	}
}

void query(int st, int dr)
{
	if (st == 1)
	{
		int i;
		for (i = dr; i >= 1; i -= zeros(i))
		{
			sum += aib[i];
		}
	}
	else
	{
		query(1, st - 1);
		sum = -sum;
		query(1, dr);
	}
}

void solve()
{
	int m, i, x, y, z;
	FILE *fin = fopen("datorii.in", "r");
	FILE *fout = fopen("datorii.out", "w");
	fscanf(fin, "%d%d", &n, &m);
	for (i = 1; i <= n; ++i)
	{
		fscanf(fin, "%d", &x);
		update(i, x);
	}
	for (i = 1; i <= m; ++i)
	{
		fscanf(fin, "%d%d%d", &x, &y, &z);
		if (x)
		{
			sum = 0;
			query(y, z);
			fprintf(fout, "%d\n", sum);
		}
		else
		{
			update(y, -z);		//scad valoarea z din ziua y
		}
	}
	fclose(fin);
	fclose(fout);
}