Cod sursa(job #545541)

Utilizator APOCALYPTODragos APOCALYPTO Data 3 martie 2011 15:43:17
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
using namespace std;
#include<iostream>
#include<fstream>
#define nmax 100005
#define nmax3 300005
#define oo 0x3f3f3f3f
#define common int m=(l+r)/2,L=2*n,R=L+1
int N,M;
int H[nmax3],full[nmax3],a[nmax];
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[L]=full[R]=1;
		full[n]=0;
		H[L]=H[R]=H[n];
		H[n]=0;
	}
	if(ql<=m)
	{
		update(L,l,m,ql,qr,v);
	}
	
	if(qr>=m+1){
	update(R,m+1,r,ql,qr,v);
	}
	if(full[L] && full[R] && H[L]==H[R])
	{
		full[n]=1;
	}
	else 
	{
		full[n]=0;
	}
	
	H[n]=max(H[L],H[R]);
}


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=0,sol=-oo;
	if(ql<=m)
	{
		x=query(L,l,m,ql,qr);
		sol=max(sol,x);
	}
	if(qr>=m+1)
	{
		x=query(R,m+1,r,ql,qr);
		sol=max(sol,x);
	}
	return sol;
}


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(full[L] && full[R] && H[L]==H[R])
		  full[n]=1;
	else 
		    full[n]=0;
	H[n]=max(H[L],H[R]);
}
	

void cit()
{
	
	ifstream fin("arbint.in");
	fin>>N>>M;
	int i,op,x,y;
	for(i=1;i<=N;i++)
	{
		fin>>a[i];
	}
	build(1,1,N);
	for(i=1;i<=M;i++)

	{
		fin>>op>>x>>y;
		
		if(op==1)
		{
			update(1,1,N,x,x,y);
		}
		else{
			cout<<query(1,1,N,x,y)<<"\n";
		}
	}		
}

int main()
{
	
	cit();
	
	return 0;
}