Cod sursa(job #1117520)

Utilizator robert_stefanRobert Stefan robert_stefan Data 23 februarie 2014 17:02:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#define IN "arbint.in"
#define OUT "arbint.out"
#define NMAX 100005

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int v[NMAX], nn, m, graf[2*NMAX], maxx;

inline void construieste(int n, int st, int dr)
{
	if(st==dr)
		graf[n]=v[st];
	else
	{
		int mijl=(st+dr)/2;
		construieste(2*n, st, mijl);
		construieste(2*n+1, mijl+1, dr);
		graf[n]=max(graf[2*n], graf[2*n+1]);
	}
}

inline void verifica (int n, int st, int dr, int a, int b)
{
	if(a<=st && b>=dr)
		maxx=max(graf[n], maxx);
	else
	{
		int mijl=(st+dr)/2;
		if(a<=mijl)
			verifica(2*n, st, mijl, a, b);
		if(b>mijl)
			verifica(2*n+1, mijl+1, dr, a, b);
	}
}

inline void actualizare(int n, int st, int dr, int a, int b)
{
	if(st==dr)
		graf[n]=b;
	else
	{
		int mijl=(st+dr)/2;
		if(a<=mijl)
			actualizare(2*n, st, mijl, a, b);
		//if(b>mijl)
		else
			actualizare(2*n+1, mijl+1, dr, a, b);
		graf[n]=max(graf[2*n], graf[2*n+1]);
	}
}

int main()
{
	int i, x, a, b;
	in>>nn>>m;
	for(i=1; i<=nn; ++i)
		in>>v[i];
	construieste(1, 1, nn);
	for(i=1; i<=m; ++i)
	{
		in>>x>>a>>b;
		if(x==0)
		{
			maxx=-1;
			verifica(1, 1, nn, a, b);
			out<<maxx<<'\n';
		}
		else
			actualizare(1, 1, nn, a, b);
	}
	in.close();
	out.close();
	return 0;
}