Cod sursa(job #523808)

Utilizator APOCALYPTODragos APOCALYPTO Data 19 ianuarie 2011 13:34:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
using namespace std;
#include<iostream>
#include<fstream>

#define common int L=2*n,R=L+1,m=(l+r)/2
int T,N,H[300000],full[300000];
int a[100005];
int sol;
ofstream fout("arbint.out");

int query(int n,int l,int r,int ql,int qr)
{
	 if(full[n])
	 {
		 return H[n];
	 }		 
	 if(ql<=l && r<=qr)
	 {
		 
		 return H[n];
		 
	 }
	 
	 common;
	 int x=-0x3f3f3f3f;
	 if(ql<=m)
	 {
		 x=query(L,l,m,ql,qr);
	 }
	 if(qr>=m+1)
	 {
		 x=max(x,query(R,m+1,r,ql,qr));
	 }
	 
	 
	 return x;
	
}

void update(int n,int l,int r,int ql,int qr,int v)
{
	if(ql<=l && r<=qr)
	{
		 H[n]=v;
		 full[n]=1;
		 return;
	}
	
	common;
	
	if(full[n])
	{
		full[n]=0;
		full[L]=full[R]=1;
		H[L]=H[R]=H[n];
	}
	
	if(ql<=m)
		update(L,l,m,ql,qr,v);
	if(qr>=m+1)
		 update(R,m+1,r,ql,qr,v);
	
	if(H[L]==H[R] && full[L] && full[R])
     full[n]=1;
	else 
		full[n]=0;
	H[n]=max(H[L],H[R]);
}



void build(int n,int l,int r)
{
    if(l>=r) {H[n]=a[l]; full[n]=1; return;}

    common;

    build(L,l,m);
    build(R,m+1,r);

    if(H[L]==H[R] && full[L] && full[R]) full[n]=1;
    else full[n]=0;

    H[n]=max(H[L],H[R]);

}


void cit()
{int op,c,b,i;
	ifstream fin("arbint.in");
	
	fin>>N>>T;
	for(i=1;i<=N;i++)
	{	fin>>a[i];
	    //cout<<a[i];
	}
	build(1,1,N);
	
	while(T--)
	{
		fin>>op;
		if(op==0)
		{   fin>>c>>b;
			fout<<query(1,1,N,c,b)<<"\n";
		}
		else 
		{fin>>c>>b;
		   update(1,1,N,c,c,b);
		}
		
	}
	
	fin.close();
	
}

int main()
{
	
	cit();
	
	fout.close();
	return 0;
}