Cod sursa(job #2833810)

Utilizator vlad2009Vlad Tutunaru vlad2009 Data 15 ianuarie 2022 18:55:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>

const int MAX_N = 1e5;
int a[1 + MAX_N], aint[1 + 4 * MAX_N];

void build(int v, int l, int r) {
  if (l == r) {
    aint[v] = a[l];
  } else {
    int mid = (l + r) / 2;
    build(2 * v, l, mid);
    build(2 * v + 1, mid + 1, r);
    aint[v] = std::max(aint[2 * v], aint[2 * v + 1]);
  }
}

void update(int v, int l, int r, int pos, int val) {
  if (l == r) {
    aint[v] = val;
  } else {
    int mid = (l + r) / 2;
    if (pos <= mid) {
      update(2 * v, l, mid, pos, val);
    } else {
      update(2 * v + 1, mid + 1, r, pos, val);
    }
    aint[v] = std::max(aint[2 * v], aint[2 * v + 1]);
  }
}

int query(int v, int l, int r, int p, int q) {
  if (p > q) {
    return -1;
  } else if (l == p && r == q) {
    return aint[v];
  } else {
    int mid = (l + r) / 2;
    return std::max(query(2 * v, l, mid, p, std::min(mid, q)), query(2 * v + 1, mid + 1, r, std::max(p, mid + 1), q));
  }
}

int main() {
  std::ifstream fin("arbint.in");
  std::ofstream fout("arbint.out");
  int n, m;
  fin >> n >> m;
  for (int i = 1; i <= n; i++) {
    fin >> a[i];
  }
  build(1, 1, n);
  while (m--) {
    int t, a, b;
    fin >> t >> a >> b;
    if (t == 0) {
      fout << query(1, 1, n, a, b) << "\n";
    } else {
      update(1, 1, n, a, b);
    }
  }
  return 0;
}