Cod sursa(job #368786)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 25 noiembrie 2009 21:41:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
# include <stdio.h>

int a[300005],maxf,i,n,b,l,x,y,k,poz;

void arb (int st,int dr,int i)
{

 if (st==dr)
 a[i]=x;
  else
  {
  int mij=(st+dr)/2;
  if (poz<=mij)
  arb (st,mij,2*i);
  else
  arb (mij+1,dr,2*i+1);

      if (a[2*i]>a[2*i+1])
      a[i]=a[2*i];
      else
      a[i]=a[2*i+1];
      }
    }



 void  max (int st,int dr,int i)
   {
   if (x<=st && y>=dr)
    {
    if (maxf<a[i])
     maxf=a[i];
     }
    else
    {

    int mij=(st+dr)/2;
    if (x<=mij)
    max (st,mij,2*i);

     if (y>mij)
     max (mij+1,dr,2*i+1);




     }
     }

    void inter (int st,int dr,int i)
{

 if (st==dr)
 a[i]=y;
  else
  {

  int mij=(st+dr)/2;
  if (x<=mij)
  inter (st,mij,2*i);
  else
  inter (mij+1,dr,2*i+1);

      if (a[2*i]>a[2*i+1])
      a[i]=a[2*i];
      else
      a[i]=a[2*i+1];
      }

   }




int main ()
{
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
scanf ("%i%i",&n,&k);

 for (i=1;i<=n;i++)
  {
  poz=i;
  scanf ("%i",&x);
  arb (1,n,1);
  }

  for (i=1;i<=k;i++)
  {
   scanf ("%i%i%i",&l,&x,&y);


   if (l==0)
    {
     maxf=-32000;
     max (1,n,1);
     printf ("%i\n",maxf);
    }
  else
   inter (1,n,1);

   }
   return 0;

   }