Cod sursa(job #539629)

Utilizator rusu_raduRusu Radu rusu_radu Data 23 februarie 2011 10:03:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
#define Nmax 100005
#define InFile "arbint.in"
#define OutFile "arbint.out"

using namespace std;

int n, m, Mx, val, pos, sr, fsh;
int Max[4*Nmax+66];

void read();
void update (int,int,int);
void query (int,int,int);

int main()
{
  int i, op, a, b;
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  read();
  for (i=1; i<=m; i++)
  {
    scanf ("%d %d %d\n", &op, &a, &b);
    if (op==0)
    {
      Mx=-1;
      sr=a; fsh=b;
      query (1, 1, n);
      printf ("%d\n", Mx);
    }
    else
    {
      pos=a; val=b;
      update (1, 1, n);
    }
  }
  return 0;
}

void read()
{
  int i, x;
  scanf ("%d %d\n", &n, &m);
  for (i=1; i<=n; i++)
  {
    scanf ("%d ", &x);
    pos=i; val=x;
    update (1, 1, n);
  }
}

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

void query (int nod, int st, int dr)
{
  if (sr<=st && dr<=fsh)
  {
    if (Max[nod]>Mx)
      Mx=Max[nod];
    return;
  }
  int mij=st+(dr-st)/2;
  if (sr<=mij) query (2*nod, st, mij);
  if (mij<fsh) query (2*nod+1, mij+1, dr);
  
}