Cod sursa(job #623667)

Utilizator rares192Preda Rares Mihai rares192 Data 20 octombrie 2011 15:47:08
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream>
using namespace std;

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

int a[400010];
int n, m;
int maxim, v, p, start, finish;

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

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;
		v = x;
		p = i;
		Update(1, 1, n);
	}
	
	int y, z, t;
	for(int i = 1; i <= m; ++i)
	{
		fin >> y >> z >> t;
		if( y == 1)
		{
			p = z;
			v = t;
			Update(1, 1, n);
		}
		else
		{
			start = z;
			finish = t;
			maxim = -9999;
			Query(1, 1, n);
			fout << maxim << '\n';
		}
	}
	
}

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

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