Pagini recente » Cod sursa (job #1430548) | Cod sursa (job #1155462) | Cod sursa (job #86035) | Cod sursa (job #2265562) | Cod sursa (job #1081349)
#include <cstdio>
#define max(a,b) a>b?a:b
#define B(x) x&1?x-1:x+1
using namespace std;
int n,m,ai[262144],p2=1,lim;
int Build(int nod)
{
int l=nod<<1,r=l+1;
if(r<lim)
ai[nod]=max(Build(l),Build(r));
else if(l<lim)
ai[nod]=Build(l);
return ai[nod];
}
int Max(int a,int b)
{
int nod=1,x=1,y=p2,m;
while((x<a)||(y>b))
{
m=(x+y)>>1;
if(m<a)
{
(nod<<=1)++;
x=m+1;
}
else
{
nod<<=1;
y=m;
}
}
if(y==b)
return ai[nod];
else
return max(ai[nod],Max(y+1,b));
}
void Update(int a)
{
int l=a<<1,r=l+1,v=ai[a],b=ai[B(a)];
ai[a]=max(ai[l],ai[r]);
if(a>1&&(ai[a]>b||v>b))
Update(a>>1);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int o,i,j,v,b;
scanf("%d%d",&n,&m);
while(p2<n)
p2<<=1;
lim=p2+n;
for(i=p2;i<lim;i++)
scanf("%d",&ai[i]);
Build(1);
while(m--)
{
scanf("%d%d%d",&o,&i,&j);
if(o)
{
i+=p2-1;
v=ai[i];
b=ai[B(i)];
ai[i]=j;
if(i>1&&(ai[i]>b||v>b))
Update(i>>1);
}
else
printf("%d\n",Max(i,j));
}
return 0;
}