Cod sursa(job #300691)

Utilizator IeewIordache Bogdan Ieew Data 7 aprilie 2009 16:59:20
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#define InFile "arbint.in"
#define OutFile "arbint.out"
#define MAXN 100001
using namespace std; 
int n,m,X,Y;
struct str
{
 int x,y,max;
 str *unu,*doi,*tata;
}*p;
str *adr[MAXN],*incepe[MAXN];

void creearearb(int x, int y,str *taticu,int kkt)
{str *q;
q=new str;

if(kkt==1)taticu->unu=q;
	else taticu->doi=q;

q->unu=NULL;
q->doi=NULL;
q->tata=taticu;
q->x=x;
if(!incepe[x])incepe[x]=q;
q->y=y;
q->max=0;
if(x==y)adr[x]=q;
	else
	{
	 creearearb(x,(x+y)/2,q,1);
	 creearearb((x+y)/2+1,y,q,2);
	}
}

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

void modificainsus(str *q,int val)
{
  if(q->max<val)
	{
	 q->max=val;
	 if(q->tata)modificainsus(q->tata,val);
	}
}
void insus(str*q,int max,int val)
{
 if(q->max==max)
	{
	 if(q->unu->max!=val)q->max=q->unu->max;
			else q->max=q->doi->max;
	 q->max=maxab(q->max,val);
	 if(q->tata)insus(q->tata,max,val);
	}
}

void modifica(str *q,int val)
{int max;
 max=q->max;
 q->max=val;
 insus(q->tata,max,val);
}

int maxim(int x,int y)
{str *q;
q=incepe[x];
if(q->y==y)return q->max;
if(q->y<y)return maxab(q->max,maxim(q->y+1,y));

while(q->unu->y>=y)q=q->unu;
if(q->y==y)return q->max;
/*if(q->y<y)*/
return maxab(q->max,maxim(q->y+1,y));
}
void rezolva()
{int i,j,x,a,b,c;
ifstream in(InFile);
in>>n>>m;
p=new str;
creearearb(1,n,p,1);
for(i=1;i<=n;i++)
	{
	 in>>x;
	 modificainsus(adr[i],x);
	}
ofstream out(OutFile);
for(i=1;i<=m;i++)
	{
	  in>>a>>b>>c;
	  if(a==1)
		{
		 modifica(adr[b],c);
		}
		 else out<<maxim(b,c)<<'\n';

	}
out.close();
in.close();
}

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