Cod sursa(job #597284)

Utilizator rumburakrumburak rumburak Data 21 iunie 2011 17:17:55
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

using namespace std;

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

const int N = 200000;
const int INF = 1000000000;

int a,b,n,t[N];

inline int max(int a, int b)
{
	return a>b ? a : b;
}

void modifica(int p, int st, int dr, int val)
{
	if(a<=st && dr<=b)//daca intervalul curent e inclus in cel pe care-l modific
	{
		t[p] = val;
		return;
	}
	int mij = (st + dr) >> 1;
	if(a <= mij)
		modifica(p<<1, st, mij, val);
	if(b > mij)
		modifica((p<<1)+1, mij+1, dr, val);
	t[p] = max(t[p<<1], t[(p<<1)+1]);
}

int maxim(int p, int st, int dr)
{
	if(a<=st && dr<=b)
		return t[p];
	int r1 = -INF, r2 = -INF, mij = (st + dr) >> 1;
	if(a <= mij)
		r1 = maxim(p<<1, st, mij);
	if(b > mij)
		r2 = maxim((p<<1)+1, mij+1, dr);
	return max(r1, r2);
}

int main()
{
	int m,i,tip,x;
	in>>n>>m;
	for(i=1 ; i <=n ; i++)
	{
		in>>x;
		a = b = i;
		modifica(1,1,n,x);
	}
	while(m--)
	{
		in>>tip>>a>>b;
		if(tip == 0)
			out<<maxim(1,1,n)<<"\n";
		else
		{
			x = b;
			b = a;
			modifica(1,1,n,x);
		}
	}
	in.close();
	out.close();
	return 0;
}