Pagini recente » Cod sursa (job #1546285) | Cod sursa (job #1915231) | Cod sursa (job #1218693) | Cod sursa (job #2416909) | Cod sursa (job #362496)
Cod sursa(job #362496)
# include <stdio.h>
int a[100005],is[700000],id[700000],st[700000],dr[700000],p,u,n,mij,m[700000],x,y,maxf,i,l,k;
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;
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;
inter (1);
printf ("%i\n",maxf);
}
else
schimba (1);
}
return 0;
}