Cod sursa(job #360173)

Utilizator serbanlupulupulescu serban serbanlupu Data 30 octombrie 2009 11:28:46
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>

using namespace std;

int n,m;
int v[100001];
int H[300003];

void update(int node, int left, int right, int poz, int val)
{
	if (left >= right)
	{
		H[node]=val;
		return;
	}
	int middle=(left+right)>>1;
	if (poz <= middle)
		update(2*node, left, middle, poz, val);
	else
		update(2*node+1, middle+1, left, poz, val);
	H[node]=max(H[2*node], H[2*node+1]);
}

int query(int node, int left, int right, int i, int j)
{
	if (i<=left && right<<j)
		return H[node];
	
	int sol=-1;
	int middle=(left+right)>>1;
	
	if (i <= middle)
		sol=max(sol, query(2*node, left, middle, i, j));
	if (middle <= j )
		sol=max(sol, query(2*node+1, middle+1, right, i, j));
	return sol;
}

void solve(const char * buff_file)
{
	fstream f(buff_file, ios::in);
	fstream g("arbint.out", ios::out);
	f>>n>>m;
	for (int i=1; i<=n; ++i)
	{
		f>>v[i];
		update(1, 1, n, i, v[i]);
	}
	int dec, a, b;
	for (int i=1; i<=m; ++i)
	{
		f>>dec>>a>>b;
		if (dec == 0)
			g<<query(1, 1, n, a, b)<<"\n";
		if (dec == 1)
		{
			update(1, 1, n, a, b);
			v[a]=b;
		}
	}
}

int main()
{
	solve("arbint.in");
	return 0;
}