Cod sursa(job #1096368)

Utilizator drobertDumitru Robert drobert Data 1 februarie 2014 21:55:18
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin( "datorii.in" );
ofstream cout( "datorii.out" );

int n, m, op, a, b, poz, val, s, start, finish;
int v[ 1000001 ];

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

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

void query( int nod,int st,int dr )
{
	int mij;
	if ( start <= st && dr <= finish )
	{
		s += v[ nod ];
		return;
	}
	mij = ( st + dr ) / 2;
	if ( start <= mij ) query( 2 * nod,st,mij );
	if ( mij < finish ) query( 2 * nod + 1,mij + 1,dr );
}

int main()
{
	int i;
	cin >> n >> m;
	for ( i = 1; i <= n; i++ )
	{
		cin >> a;
		poz = i;
		val = a;
		update1( 1,1,n );
	}
	for ( i = 1; i <= m; i++ )
	{
		cin >> op >> a >> b;
		if ( op )
		{
			s = 0;
			start = a;
			finish = b;
			query( 1,1,n );
			cout << s << '\n';
		}
		else
		{
			poz = a;
			val = b;
			update2( 1,1,n );
		}
	}
}