Cod sursa(job #614401)

Utilizator david_raucaRauca Ioan David david_rauca Data 6 octombrie 2011 14:18:36
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m, p, v, start, finish, sum;

void Read();

void Update( int nod, int st, int dr);
void Query(int nod, int st, int dr );

int arb[400001];

int main()
{
	Read();
	
	fin.close();
	fout.close();
	
	return 0;
}

void Read()
{
	fin >> n >> m;
	
	int x;
	
	for( int i = 1; i <= n; ++i )
	{
		fin >> x;
		p = i;
		v = x;
		Update(1, 1, n );
	}
	
	int a, b, c;
	/*
	for( int i = 1; i <= 4*n; ++i )
		fout << arb[i] << ' ';
	fout <<'\n';
	*/
	for( int i = 1; i <= m; ++i )
	{
		fin >> a >> b >> c;
		if( a == 1 )
		{
			p = b;
			v = c;
			Update(1, 1, n);
		}
		if( a == 0 )
		{
			start = b;
			finish = c;
			sum = 0;
			Query(1, 1, n);
			fout << sum << ' ';
		}
	}
}

void Update(int nod, int st, int dr )
{
	if( st == dr )
	{
		arb[nod] = v;
		return;
	}
	
	int mij = (st + dr) / 2;
	
	if( mij >= p )
		Update( 2*nod, st, mij );
	if( mij < p )
		Update( 2*nod+1, mij+1, dr);
	
	arb[nod] = arb[2*nod] + arb[2*nod+1];
}

void Query( int nod, int st, int dr )
{
	if( start <= st && finish >= dr )
	{
		sum += arb[nod];
		return;
	}
	
	int mij = (st + dr) / 2;
	
	if( start <= mij )
		Query( 2*nod, st, mij );
	if( finish > mij )
		Query( 2*nod + 1, mij+1, dr );
}