Cod sursa(job #2157646)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 9 martie 2018 19:35:19
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 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];

#define which(i) (ceil(1.0 * i / _sqrt))

struct Bucata {
  int inc, sf, val;

  void recalc() {
    int res = 0;
    for (int i = inc; i <= sf; i++)
      if (a[i] > res)
        res = a[i];
    val = res;
  }
}b[SQRTMAX];

int nb;

void init() {
  _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;

}

void citire() {
  for (int i = 1; i <= n; i++) {
    scanf("%d ", &a[i]);
    int k = which(i);
    if (a[i] > b[k].val)
      b[k].val = a[i];
  }
}

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

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

  init();
  citire();

  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 = which(i);
      if (val > b[k].val)
        b[k].val = val;
      else 
        b[k].recalc();
    } else {
      int st, dr;
      scanf("%d %d ", &st, &dr);
      int bSt = which(st), bDr = which(dr);
      int query = 0;

      if (st > b[bSt].inc) {
        for (int i = st; i <= b[bSt].sf; i++)
          if (a[i] > query)
            query = a[i];
      } else if (st == b[bSt].inc) {
        if (b[bSt].val > query)
          query = b[bSt].val;
      }

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

      if (dr < b[bDr].sf) {
        for (int i = b[bDr].inc; i <= dr; i++)
          if (a[i] > query)
            query = a[i];
      } else if (dr == b[bDr].sf) {
        if (b[bDr].val > query)
          query = b[bDr].val;
      }

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

  return 0;
}