Cod sursa(job #397561)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 17 februarie 2010 10:14:06
Problema Datorii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
#define nmax 15010
long v[4*nmax], n, m, i, sol;

FILE *f, *g;

int sum(long a, long b)
{	return a+b;
}

void update(long val, long poz, long nod, long s, long d)
{	long mj;
	if(s==d)
	{	v[nod]=v[nod]-val;
		return;
	}
	mj=(s+d)/2;
	if(poz<=mj) update(val, poz, 2*nod, s, mj);
	else 	    update(val, poz, 2*nod+1, mj+1, d);
	v[nod]=sum(v[2*nod], v[2*nod+1]);
}

void find(long nod, long s, long d, long a, long b)
{	long mj;
	if(s>=a && d<=b)
	{	sol+=v[nod];
		return;
	}
	mj=(s+d)/2;
	if(a<=mj) find(2*nod, s, mj, a, b);
	if(b>mj)  find(2*nod+1, mj+1, d, a, b);
}


int main()
{       long op, x,  a, b;
	f=fopen("datorii.in", "r");
	g=fopen("datorii.out", "w");
	fscanf(f, "%ld%ld", &n, &m);
	for(i=1; i<=n; i++)
	{	fscanf(f, "%ld", &x);  x=(-1)*x;
		update(x, i, 1, 1, n);
	}
	for(i=1; i<=m; i++)
	{       fscanf(f, "%ld%ld%ld", &op, &a, &b);
		if(op==1)
		{	sol=0;
			find(1, 1, n, a, b);
			fprintf(g, "%ld\n", sol);
		}
		if(op==0)
			update(b, a, 1, 1, n);
	}
	return 0;
}