Cod sursa(job #645754)

Utilizator ms-ninjacristescu liviu ms-ninja Data 10 decembrie 2011 14:29:00
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
using namespace std;

int val, poz,v[15001],inc,sf,maxim;

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

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

void answer(int nod, int st, int dr)
{
	if(inc<=st && dr<=sf)
	{
		maxim+=v[nod];
		return;
	}
	int mijloc=(st+dr)/2;
	if(inc<=mijloc)
		answer(nod*2,st,mijloc);
	if(mijloc<sf)
		answer(nod*2+1,mijloc+1,dr);
}

int main()
{
	ifstream fin("datorii.in");
	ofstream fout("datorii.out");
	int n, m, i,x;
	fin>>n >>m;
	
	for(i=1;i<=n;++i)
	{
		fin>>x;
		poz=i;
		val=x;
		update(1,1,n);
	}
	int a, b, tip;
	for(i=1;i<=m;++i)
	{
		fin>>tip >>a >>b;
		if(tip==1)
		{
			maxim=0;
			inc=a;
			sf=b;
			answer(1,1,n);
			fout<<maxim<<'\n';
		}
		else
		{
			val=b;
			poz=a;
			update1(1,1,n);
		}
	}
	
	return 0;
}