Cod sursa(job #153605)

Utilizator AlxCojocaru Alexandru Alx Data 10 martie 2008 17:15:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>
long max[400002],m,n,a,b,x,pos,val,mx;
void up(long nod,long l,long r)
{
 if (l==r)
 {
  max[nod]=val;
  return;
 }
 long d=(l+r)/2;
 if (pos<=d)
  up(2*nod,l,d);
 else
  up(2*nod+1,d+1,r);
 max[nod]=max[2*nod]>max[2*nod+1] ? max[2*nod] : max[2*nod+1];
}
void q(long nod,long l,long r)
{
 if (a<=l&&r<=b)
 {
  if (mx<max[nod])
   mx=max[nod];
  return;
 }
 long d=(l+r)/2;
 if (a<=d)
  q(2*nod,l,d);
 if (d<b)
  q(2*nod+1,d+1,r);
}
int main()
{
 freopen("arbint.in","r",stdin);
 freopen("arbint.out","w",stdout);
 scanf("%ld %ld",&n,&m);
 long i;
 for (i=1;i<=n;i++)
 {
  scanf("%ld",&a);
  pos=i;
  val=a;
  up(1,1,n);
 }
 for (i=0;i<m;i++)
 {
  scanf("%ld %ld %ld",&x,&a,&b);
  if (x)
  {
   pos=a;
   val=b;
   up(1,1,n);
  }
  else
  {
   mx=-1;
   q(1,1,n);
   printf("%ld\n",mx);
  }
 }
 return 0;
}