Cod sursa(job #2737294)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 4 aprilie 2021 17:23:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

#define debug(x) cerr << #x << " = " << x << "\n";

ifstream in("arbint.in");
ofstream out("arbint.out");

const int inf = (int)1e9 + 7;
const int max_n = (int)1e5 + 5;

int n, m;

int seg[max_n * 4];

int v[max_n];

void build(int u, int l, int r) {
  if (l == r) {
    seg[u] = v[l];
    return;
  }
  int m = (l + r) / 2;
  build(2 * u, l, m);
  build(2 * u + 1, m + 1, r);
  seg[u] = max(seg[2 * u], seg[2 * u + 1]);
}

void update(int u, int l, int r, int pos, int val) {
  if (l == r && l == pos) {
    seg[u] = val;
    return;
  }
  int m = (l + r) / 2;
  if (pos <= m) {
    update(2 * u, l, m, pos, val);
  } else {
    update(2 * u + 1, m + 1, r, pos, val);
  }
  seg[u] = max(seg[2 * u], seg[2 * u + 1]);
}

int query(int u, int l, int r, int ql, int qr) {
  if (l > qr || r < ql) {
    return -inf;
  }
  if (l >= ql && r <= qr) {
    return seg[u];
  }
  int m = (l + r) / 2;
  return max(query(2 * u, l, m, ql, qr),
             query(2 * u + 1, m + 1, r, ql, qr));
}

int main() {
  in >> n >> m;
  for (int i = 1; i <= n; i++) {
    in >> v[i];
  }
  build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    int op, x, y;
    in >> op >> x >> y;
    if (op == 0) {
      out << query(1, 1, n, x, y) << "\n";
    } else {
      update(1, 1, n, x, y);
    }
  }
  return 0;
}