Cod sursa(job #2157617)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 9 martie 2018 19:17:48
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
// vim: tabstop=2:shiftwidth=2:expandtab:syntax=off

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;

#define NMAX 100005
#define SQRTMAX 360

int n, m, _sqrt;
int a[NMAX], bucata[SQRTMAX];

struct Bucata {
  int inc, sf, val;
  void recalc() {
    int res = 0;
    for (int i = inc; i <= sf; i++)
      res = max(res, a[i]);
    val = res;
  }
}b[SQRTMAX];

int nb;

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

  scanf("%d %d ", &n, &m);

  _sqrt = sqrt(n);
  nb = ceil(n / sqrt(n));

  b[1].inc = 1;
  b[1].sf = _sqrt;

  for (int i = 2; i < nb; i++) {
    b[i].inc = b[i - 1].sf + 1;
    b[i].sf = b[i].inc + _sqrt - 1;
    b[i].val = 0;
  }
  b[nb].inc = b[nb - 1].sf + 1;
  b[nb].sf = n;

  for (int i = 1; i <= n; i++) {
    scanf("%d ", &a[i]);
    int k = ceil(i * 1.0 / _sqrt);
    b[k].val = max(b[k].val, a[i]);
  }

  for (int i = 1; i <= m; i++) {
    int tip;
    scanf("%d ", &tip);

    if (tip == 1) {
      int pos, val;
      scanf("%d %d ", &pos, &val);
      a[pos] = val;
      int k = ceil(i * 1.0 / _sqrt);
      if (val > b[k].val)
        b[k].val = val;
      else 
        b[k].recalc();
    } else {
      int st, dr;
      scanf("%d %d ", &st, &dr);
      int bSt = ceil(st * 1.0 / _sqrt);
      int bDr = ceil(dr * 1.0 / _sqrt);
      int query = 0;

      for (int i = st; i <= b[bSt].sf; i++)
        query = max(query, a[i]);

      for (int i = b[bDr].inc; i <= dr; i++)
        query = max(query, a[i]);

      for (int i = bSt + 1; i < bDr; i++)
        query = max(query, b[i].val);

      printf("%d\n", query);
    }
  }

  return 0;
}