Pagini recente » Cod sursa (job #2901324) | Cod sursa (job #17463) | Cod sursa (job #1641949) | Cod sursa (job #1103980) | Cod sursa (job #1815582)
#include<cstdio>
#include<algorithm>
using namespace std;
int v[400001],maxim;
long long vc[200001],i,j,n,m,q,start,finish,q1;
void build(long long st,long long dr)
{
if(st<dr)
if(st==dr-1)
{
int poz=dr/2;
v[poz]=max(v[st],v[dr]);
}
else
{
build((st+dr)/2+1,dr);
build(st,(st+dr)/2);
}
}
void schimb(int poz1)
{
if(poz1>=2)
{
int poz=(poz1+1)/2;
int st=poz*2-1;
int dr=poz*2;
v[poz]=max(v[st],v[dr]);
schimb(poz);
}
}
void query(long long nod,long long st,long long dr)
{
if(start<=st&&dr<=finish)
{
if(maxim<v[nod])
maxim=v[nod];
}
else
{
long long div=(st+dr)/2;
if (start<=div&&2*nod<=n)
query(2*nod-1,st,div);
if (div<finish&&2*nod<=n)
query(2*nod,div+1,dr);
}
}
int main ()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%lld",&n);
scanf("%lld",&q1);
for(i=1;i<=n;i++)
scanf("%lld",&vc[i]);
q=1;
while(q<=n)
q*=2;
q*=2;
for(i=q/2+1;i<=q/2+n;i++)
v[i]=vc[i-q/2];
build(1,q);
n=q;
for(i=1;i<=q1;i++)
{
long long x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
long long poz=y+n/2;
long long poz1=z+n/2;
start=poz;
finish=poz1;
maxim=0;
if(x==0)
{
query(2,n/2+1,n-1);
printf("%d\n",maxim);
}
else
{
v[poz]=z;
schimb(poz);
}
}
return 0;
}