Cod sursa(job #956537)

Utilizator cahemanCasian Patrascanu caheman Data 3 iunie 2013 12:27:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>

using namespace std;

int aint[260005], p = 1;

inline int max(int a, int b)
{
  if(a > b)
    return a;
  else
    return b;
}

int query(int ind, int st, int dr, int cst, int cdr)
{
  int med;
  if(cst == st && cdr == dr)
    return aint[ind];
  else
  {
    med = (st + dr) >> 1;
    if(cst <= med && cdr > med)
      return max(query(ind + ind, st, med, cst, med), query(ind + ind + 1, med + 1, dr, med + 1, cdr));
    else
    {
      if(cst <= med)
        return query(ind + ind, st, med, cst, cdr);
      else
        return query(ind + ind + 1, med + 1, dr, cst, cdr);
    }
  }
}

void update(int poz, int val)
{
  int cpoz;
  cpoz = poz + p - 1;
  aint[poz + p - 1] = val;
  cpoz = cpoz/2;
  while(cpoz)
  {
    aint[cpoz] = max(aint[cpoz + cpoz], aint[cpoz + cpoz + 1]);
    cpoz = cpoz/2;
  }
}

int main()
{
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
  int n, m, i, a, b, c;
  scanf("%d%d", &n, &m);
  while(p < n)
  {
    p += p;
  }
  for(i = 1; i <= n; ++ i)
    scanf("%d", &aint[p + i - 1]);
  for(i = p - 1; i >= 1; -- i)
    aint[i] = max(aint[i + i], aint[i + i + 1]);
  for(i = 1; i <= m; ++ i)
  {
    scanf("%d%d%d", &a, &b, &c);
    if(a == 0)
      printf("%d\n",query(1, 1, p, b, c));
    else
      update(b, c);
  }
  return 0;
}