Cod sursa(job #2157689)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 9 martie 2018 20:13:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;

#define NMAX 100005
#define SQRTMAX 360

int n, m, _sqrt, nb, a[NMAX];

#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++)
      res = max(res, a[i]);
    val = res;
  }
}b[SQRTMAX];

void init() {
  _sqrt = sqrt(n);
  nb = which(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].sf = min(b[nb].sf, n);
}

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

int runQuery(int st, int dr) {
  int bSt = which(st), bDr = which(dr);
  int query = 0;

  if (bSt == bDr) {
    if (st == b[bSt].inc && dr == b[bDr].sf)
      return b[bSt].val;
    else {
      for (int i = st; i <= dr; i++)
        query = max(query, a[i]);
      return query;
    }
  }

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

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

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

  return query;
}

void runUpdate(int pos, int val) {
  a[pos] = val;
  int k = which(pos);
  if (val > b[k].val) b[k].val = val;
  else b[k].recalc();
}

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

    if (tip == 1)
      runUpdate(a, b);
    else
      printf("%d\n", runQuery(a, b));
  }

}

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

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

  init();
  citire();
  rezolvare();

  return 0;
}