Cod sursa(job #458914)

Utilizator Antika89noname Antika89 Data 26 mai 2010 22:20:18
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>

int arb[400050], n, m, val, poz, maxim, s, f;

int max(int x, int y) {return x > y ? x : y;}

void update(int nod, int st, int dr)
{
   if (st == dr)
   {
      arb[nod] = val;
      return;
   }
   int mij = (st + dr) / 2;
   if (poz <= mij) update(2 * nod, st, mij);
   else update(2 * nod + 1, mij + 1, dr);
   arb[nod] = max(arb[2*nod], arb[2*nod+1]);
}

void query(int nod, int st, int dr)
{
   if (s <= st && dr <= f)
   {
      if (maxim < arb[nod]) maxim = arb[nod];
      return;
   }
   int mij = (st + dr) / 2;
   if (s <= mij) query(2 * nod, st, mij);
   if (mij < f) query(2 * nod + 1, mij + 1, dr);
}



int main()
{
   freopen("arbint.in","r",stdin);
   freopen("arbint.out","w",stdout);

   int i, op, a, b;
   scanf("%d %d",&n, &m);
   for (i = 1; i <= n; i++)
   {
      scanf("%d",&a);
      poz = i;
      val = a;
      update(1,1,n);
   }

   for (i = 1; i <= m; i++)
   {
      scanf("%d %d %d", &op, &a, &b);
      if (!op)
      {
	 maxim = -1;
	 s = a; f = b;
	 query(1,1,n);
	 printf("%d\n",maxim);
      }
      else
      {
	 poz = a; val = b;
	 update(1,1,n);
      }
   }
   return 0;
}