Pagini recente » Cod sursa (job #1946114) | Cod sursa (job #3130438) | Monitorul de evaluare | Cod sursa (job #2729971) | Cod sursa (job #384808)
Cod sursa(job #384808)
#include <stdio.h>
#define max 100010
#define bit(x) (x&-x)
int t[max],a[max],n,m,i,x,y,op;
int query(int st,int dr)
{
int p,q,m=0;
for(p=dr-bit(dr); st<=dr; dr=p,p-=bit(p))
{
if(p+1>=st) q=t[dr];
else { p=dr-1; q=p+1; }
if(a[m]<a[q]) m=q;
}
return m;
}
void update(int x)
{
int y,z;
for(y=x; x<=n; x+=bit(x))
if(t[x]==y)
{
z=query(x-bit(x)+1,x-1);
if(a[z]>a[x]) t[x]=z;
else t[x]=x;
}
else
if(a[t[x]]<a[y]) t[x]=y;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
a[0]=-max;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++) { scanf("%d",&a[i]); update(i); }
for(; m>0; m--)
{
scanf("%d%d%d",&op,&x,&y);
if(op==0) printf("%d\n",a[query(x,y)]);
else a[x]=y,update(x);
}
return 0;
}