Pagini recente » Cod sursa (job #456134) | Cod sursa (job #2716426) | Cod sursa (job #401893) | Cod sursa (job #2791968) | Cod sursa (job #362504)
Cod sursa(job #362504)
# include <stdio.h>
int a[100005],is[300000],id[300000],st[300000],dr[300000],p,u,n,mij,m[300000],x,y,maxf,i,l,k,q;
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++;
st[p]=u;
is[u]=is[p];
id[u]=mij;
u++;
dr[p]=u;
is[u]=mij+1;
id[u]=id[p];
}
if (is[p]==id[p])
m[p]=a[is[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 (int nod)
{
int mij=(is[nod]+id[nod])/2;
if (is[nod]==x && id[nod]==x)
{
m[nod]=y;
a[x]=y;
}
else
{
if (x<=mij)
schimba (st[nod]);
else
schimba (dr[nod]);
if (m[st[nod]]>m[dr[nod]])
m[nod]=m[st[nod]];
else
m[nod]=m[dr[nod]];
}
}
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 (y-x<=10)
for (q=x;q<=y;q++)
if (maxf<a[q])
maxf=a[q];
else
inter (1);
printf ("%i\n",maxf);
}
else
schimba (1);
}
return 0;
}