Cod sursa(job #384808)

Utilizator cristikIvan Cristian cristik Data 20 ianuarie 2010 23:37:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#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;
}