Pagini recente » Cod sursa (job #1571160) | Cod sursa (job #2577899) | Cod sursa (job #1973206) | Cod sursa (job #908382) | Cod sursa (job #362759)
Cod sursa(job #362759)
# include <stdio.h>
int a[100005],is[300000],id[300000],st[300000],dr[300000],t[300000],p,u,n,mij,m[300000],x,y,maxf,i,l,k,q,sir[300000],no,maxim,ok;
void crearearb ()
{
is[1]=1;
id[1]=n;
p=1;
u=1;
while (p<=u)
{
if (is[p]<id[p])
{
mij=(is[p]+id[p])/2;
u++;
t[u]=p;
st[p]=u;
is[u]=is[p];
id[u]=mij;
u++;
t[u]=p;
dr[p]=u;
is[u]=mij+1;
id[u]=id[p];
}
if (is[p]==id[p])
{
m[p]=a[is[p]];
sir[is[p]]=p;
}
p++;
}
}
void max (int nod)
{
if (st[nod]!=0 || dr[nod]!=0)
{
max (st[nod]);
max (dr[nod]);
}
if (m[nod]==0)
if (m[st[nod]]>m[dr[nod]])
m[nod]=m[st[nod]];
else
m[nod]=m[dr[nod]];
}
void inter (int nod)
{
int mij;
if (is[nod]>=x && id[nod]<=y)
{
if (maxf<m[nod])
maxf=m[nod];
}
else
{
mij=(is[nod]+id[nod])/2;
if (x<=mij)
inter (st[nod]);
if (y>mij)
inter (dr[nod]);
}
}
void schimba ()
{ no=sir[x];
a[is[no]]=y;
m[no]=y;
ok=0;
while (ok==0)
{
no=t[no];
if (m[st[no]]>m[dr[no]])
maxim=m[st[no]];
else
maxim=m[dr[no]];
if (maxim>m[no])
m[no]=maxim;
else
ok=1;
}
}
int main ()
{
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
scanf ("%i%i",&n,&k);
for (i=1;i<=n;i++)
scanf ("%i",&a[i]);
crearearb ();
max (1);
for (i=1;i<=k;i++)
{
scanf ("%i%i%i",&l,&x,&y);
if (l==0)
{
maxf=-32000;
if (x==y)
maxf=a[x];
else
inter (1);
printf ("%i\n",maxf);
}
else
schimba ();
}
return 0;
}