Cod sursa(job #344195)

Utilizator serbanlupulupulescu serban serbanlupu Data 28 august 2009 22:41:46
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
//Arbori de intervale
//(c) Lupulescu Serban
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

vector <int > v(100001);
vector <int > H(300003);
int n,m;

inline 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, right, poz, val);

	H[node]=max(H[2*node], H[2*node+1]);
}

inline int query(int node, int left, int right, int i, int j)
{
	if ( i<=left && right <= j )
		return H[node];

	int middle=(left+right)>>1;
	int s=-1;

	if ( i <= middle )
		s=max(s, query(2*node, left, middle, i, j));

	if (middle < j)
		s=max(s, query(2*node+1, middle+1, right, i, j));

	return s;
}

int main()
{
	fstream f("arbint.in",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]);
	}

	for (int i=1; i<=m; ++i)
	{
		int dec,a,b;
		f>>dec>>a>>b;
		if (dec==1)
		{
			update(1, 1, n, a, v[b]);
			v[a]=v[b];
		}
		if (dec==0)
			g<<query(1, 1, n, a, b)<<"\n";
	}
	f.close();
	g.close();
	return 0;
}