Cod sursa(job #217409)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 28 octombrie 2008 13:49:36
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
long n, m, i, j, aa, bb, x, t[80000], init[20000];
int tip;

void initializeaza(long st, long dr, long poz);
long interogare(long p, long a, long b);
void modif(long p, long val);

int main()
{
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	scanf("%ld%ld", &n, &m);
	initializeaza(1, n, 1);
	for (i=1; i<=n; i++)
	{
		scanf("%ld", &x);
		modif(init[i], x);
	}//for i
	for (i=0; i<m; i++)
	{
		scanf("%d%ld%ld", &tip, &aa, &bb);
		if (tip==1)
			printf("%ld\n", interogare(1, 1, n));
		if (tip==0)
			modif(init[aa], t[init[aa]]-bb);
	}//for i
	return 0;
}//main

void initializeaza(long st, long dr, long poz)
{
	long mij;
	if (st==dr)
		init[st]=poz;
	else
	{
		mij=(st+dr)/2;
		initializeaza(st, mij, 2*poz);
		initializeaza(mij+1, dr, 2*poz+1);
	}//else
}//initializeaza

long interogare(long p, long a, long b)
{
	long mij, rez;
	if ((aa<=a)&&(b<=bb))
		return t[p];
	mij=(a+b)/2;
    rez=0;
	if (aa<=mij)
		rez=rez+interogare(2*p, a, mij);
	if (bb>mij)
		rez=rez+interogare(2*p+1, mij+1, b);
	return rez;
}//interogare

void modif(long p, long val)
{
	t[p]=val;
	p/=2;
	while (p)
    {
		t[p]=t[p*2]+t[2*p+1];
		p/=2;
	}//while	
}//modif