Cod sursa(job #362762)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 10 noiembrie 2009 21:52:23
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
# include <stdio.h>

int a[105],is[300],id[300],st[300],dr[300],p,u,n,mij,m[300],x,y,maxf,i,l,k,q;

void crearearb ()
{
is[1]=1;
id[1]=n;
p=1;
u=1;

  while (p<=u)
   {
    if (is[p]<id[p])
    {
    mij=(is[p]+id[p])/2;
    u++;

    st[p]=u;
    is[u]=is[p];
    id[u]=mij;

    u++;

    dr[p]=u;
    is[u]=mij+1;
    id[u]=id[p];

    }
     if (is[p]==id[p])
     m[p]=a[is[p]];


     p++;

      }

      }


      void max (int nod)
      {

	  if (st[nod]!=0 || dr[nod]!=0)
	  {
	  max (st[nod]);
	  max (dr[nod]);
	  }
	  if (m[nod]==0)
	  if (m[st[nod]]>m[dr[nod]])
	  m[nod]=m[st[nod]];
	  else
	  m[nod]=m[dr[nod]];




	}


 void inter (int nod)

  {
   int mij;

   if (is[nod]>=x && id[nod]<=y)
   {

  if (maxf<m[nod])
   maxf=m[nod];
   }
   else
   {
   mij=(is[nod]+id[nod])/2;
   if (x<=mij)
   inter (st[nod]);

   if (y>mij)
   inter (dr[nod]);

   }


   }

    void schimba (int nod)

    {
   int  mij=(is[nod]+id[nod])/2;
   if (is[nod]==x && id[nod]==x)
   {
   m[nod]=y;
   a[x]=y;
   }
   else
   {
   if (x<=mij)
   schimba (st[nod]);
   else
   schimba (dr[nod]);

   if (m[st[nod]]>m[dr[nod]])
   m[nod]=m[st[nod]];
   else
   m[nod]=m[dr[nod]];

   }

   }








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

 for (i=1;i<=n;i++)
  scanf ("%i",&a[i]);


  crearearb ();
  max (1);

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

  if (l==0)
  {
  maxf=-32000;

  if (x==y)
  maxf=a[x];

  else
  inter (1);

  printf ("%i\n",maxf);
  }
  else
  
  schimba (1);

  }




  return 0;
  }