【限制】
保证序列中的所有的数都在longint范围内
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a,v[300000],c,d,e,g,i,j,k,ans,x;
double b;
int main()
{
scanf("%d",&a);
b=log(a)/log(2);
if (b!=trunc(b))
c=trunc(b)+1;
e=1;
for (d=1;d<=c;d++)
{
e=e*2;
}
for (g=1;g<=a;g++)
scanf("%d",&v[g+e]);
for (g=e-1;g>=1;g--)
v[g]=max(v[g*2],v[g*2+1]);
v[0]=-2147483647;
scanf("%d",&c);
for (g=1;g<=c;g++)
{
scanf("%d%d%d",&i,&j,&k);
ans=-2147483647;
if (i==1)
{
j=j+e;
v[j]=k;
while (j!=0)
{
j=j/2;
v[j]=max(v[j*2],v[j*2+1]);
}
}
if (i==2)
{
j=j+e-1;
k=k+e+1;
while ((j xor k)!=1)
{
if (j%2==0)
ans=max(ans,v[j+1]);
if (k%2==1)
ans=max(ans,v[k-1]);
j=j/2;
k=k/2;
}
printf("%d\n",ans);
}
}
}