Pagini recente » Cod sursa (job #1904301) | Cod sursa (job #92841) | Cod sursa (job #1199224) | Cod sursa (job #2988446) | Cod sursa (job #301504)
Cod sursa(job #301504)
#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;
}