Cod sursa(job #405591)

Utilizator bora_marianBora marian bora_marian Data 28 februarie 2010 12:55:51
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
# include <fstream>
using namespace std;
int n, m, v[100000], p, q, x, poz;

void update (int nod, int st, int dr)
{
	if (st==dr)
	{
		v[nod]=x;
		return;
	}
	int mij=(st+dr)/2;
	if (poz<=mij)
       update(2*nod, st, mij);
	else  
       update(2*nod+1, mij+1, dr);
	v[nod]=v[2*nod]+v[2*nod+1];
}

int caut (int nod, int st, int dr)
{
	if (p<=st && dr<=q)
		return v[nod];
	int rez=0;
	int mij=(st+dr)/2;
	if (p<=mij)
       rez+=caut(2*nod, st, mij);
	if (mij<q) 
       rez+=caut(2*nod+1, mij+1, dr);
	return rez;
}

void datorie (int nod, int st, int dr)
{
	if (st==dr)
	{
		v[nod]-=x;
		return;
	}
	int mij=(st+dr)/2;
	if (poz<=mij)
        datorie(2*nod, st, mij);
	else 
       datorie (2*nod+1, mij+1, dr);
	v[nod]=v[2*nod]+v[2*nod+1];
}

int main()
{
	ifstream fin ("datorii.in");
	ofstream fout("datorii.out");
	fin>>n>>m;
	for (int i=1;i<=n;i++)
	{
		fin>>x;
		poz=i;
		update(1, 1, n);
	}
	int k;
	for (;m;--m)
	{
		fin>>k>>p>>q;
		if (k==0)
		{
			x=q;
			poz=p;
			datorie(1, 1, n);
		}
		else
			fout<<caut(1, 1, n),fout<<endl;
	}
	return 0;
}