Cod sursa(job #539934)

Utilizator ChallengeMurtaza Alexandru Challenge Data 23 februarie 2011 15:28:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

using namespace std;

const char InFile[]="arbint.in";
const char OutFile[]="arbint.out";
const int aint_SIZE=1<<18;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,M,aint[aint_SIZE],x,op,a,b;

int update_pos,update_val,query_st,query_dr;

inline int father(const int &nod)
{
	return nod>>1;
}

inline int left(const int &nod)
{
	return nod<<1;
}

inline int right(const int &nod)
{
	return (nod<<1)+1;
}

void update_aint(int st, int dr, int nod)
{
	if(st>dr)
	{
		return;
	}
	if(st==dr)
	{
		aint[nod]=update_val;
		return;
	}
	int l=left(nod);
	int r=right(nod);
	int m=st+((dr-st)>>1);
	if(update_pos<=m)
	{
		update_aint(st,m,l);
	}
	else
	{
		update_aint(m+1,dr,r);
	}
	aint[nod]=max(aint[l],aint[r]);
}

inline void update(int i, int x)
{
	update_pos=i;
	update_val=x;
	update_aint(1,N,1);
}

int query_aint(int st,int dr,int nod)
{
	if(query_st<=st && dr<=query_dr)
	{
		return aint[nod];
	}
	int l=left(nod);
	int r=right(nod);
	int m=st+((dr-st)>>1);
	int lv=0,rv=0;
	if(query_st<=m)
	{
		lv=query_aint(st,m,l);
	}
	if(query_dr>m)
	{
		rv=query_aint(m+1,dr,r);
	}
	return max(lv,rv);
}

inline int query(const int &st, const int &dr)
{
	query_st=st;
	query_dr=dr;
	return query_aint(1,N,1);
}

int main()
{
	fin>>N>>M;
	for(register int i=1;i<=N;++i)
	{
		fin>>x;
		update(i,x);
	}
	for(register int i=1;i<=M;++i)
	{
		fin>>op>>a>>b;
		if(op==1)
		{
			update(a,b);
		}
		else
		{
			fout<<query(a,b)<<"\n";
		}
	}
	fin.close();
	fout.close();
	return 0;
}