Cod sursa(job #269766)

Utilizator cnatlLaurian cnatl Data 3 martie 2009 13:25:48
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<stdio.h>
void solve(), read(),aloca(),build(),pune(),update(long k);
long max(long i1, long i2),quiz(long k);
long n,m,i,*x,*y,*h,baza=1,nn=1,cod,a,b;
int main()
{   read();
    build();
    solve();
    return 0;
}
void read()
{    freopen("arbint.in","r",stdin);
     freopen("arbint.out","w",stdout);
     scanf("%ld%ld",&n,&m);
     while(baza<n){ baza*=2;nn+=baza;}  baza=nn-baza;
     aloca();
     for(i=1;i<=n;i++) scanf("%ld",&h[baza+i]);
}
void aloca()
{    x=new long[nn+3];
     y=new long[nn+3];
     h=new long[nn+3];
}
void build()
{    for(i=baza+1;i<=nn;i++)
     {   x[i]=i-baza; y[i]=i-baza; }
     for(i=baza+n+1;i<=nn;i++) h[i]=0;
     for(i=baza;i>=1;i--) { x[i]=x[i*2]; y[i]=y[i*2+1];
                            h[i]=max(h[i*2],h[i*2+1]);
                            }
}
void solve()
{    for(;m;m--)
     {    scanf("%ld%ld%ld",&cod,&a,&b);
          if(cod){ pune(); continue;}
          i=quiz(1);
          printf("%ld\n",quiz(1));
     }
}
long max( long i1, long i2)
{   return (i1>i2)?i1:i2;
}
long quiz(long k)
{    long st=k*2, dr=k*2+1, maxst, maxdr;
     if(x[k]>b || y[k]<a) return 0;
     if(x[k]>=a && y[k]<=b) return h[k];
     maxst=quiz(st); maxdr=quiz(dr);
     return max(maxst, maxdr);
}
void pune()
{    h[baza+a]=b;
     update(baza+a);
}
void update(long k)
{    if(k==1) return;
     long ii=k/2; i=h[ii];
     h[ii]=max(h[ii*2],h[ii*2+1]);
     if(i!=h[ii]) update(ii);
}