Cod sursa(job #405592)

Utilizator bora_marianBora marian bora_marian Data 28 februarie 2010 12:59:35
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 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");
	freopen ("datorii.out", "w", stdout);
	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
		 {
           int sol=caut(1,1,n);
           printf("%d",sol);
           printf("\n");            	
         }
    }
	return 0;
}