Cod sursa(job #301504)

Utilizator IeewIordache Bogdan Ieew Data 8 aprilie 2009 11:39:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
using namespace std;
#define InFile "arbint.in"
#define OutFile "arbint.out"
#define MAXN 100001
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]==NULL)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!=NULL)
        modificainsus(q->tata,val);
	}
}
void insus(str*q)
{int max;
max=maxab(q->unu->max,q->doi->max);
if(q->max!=max)
	{
	 q->max=max;
    if(q->tata!=p)insus(q->tata);
	}
}

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

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;
while(q->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,x,a,b,c;
ifstream in(InFile);
in>>n>>m;
for(i=1;i<=n;i++)incepe[i]=NULL;
p=new str;
p->tata=NULL;
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;
}