Cod sursa(job #2570185)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 4 martie 2020 15:27:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda r3capitusulare Marime 1.62 kb
#include <bits/stdc++.h>
#define dbg() cerr <<
#define name(x) (#x) << ": " << (x) << ' ' <<

using namespace std;

const int NMAX = (int)1e5;

int v[NMAX];

namespace SegmTree {
  int tree[4 * NMAX];

  void Recalc(int node) {
    tree[node] = max(tree[2 * node + 1], tree[2 * node + 2]);
  }

  void Build(int node, int left, int right) {
    if (left == right) {
      tree[node] = v[left];
      return;
    }
    int mid = left + (right - left) / 2;
    Build(2 * node + 1, left, mid);
    Build(2 * node + 2, mid + 1, right);
    Recalc(node);
  }

  void Update(int node, int left, int right, int pos, int val) {
    if (left == right) {
      tree[node] = val;
      return; 
    }
    int mid = left + (right - left) / 2;
    if (pos <= mid)
      Update(2 * node + 1, left, mid, pos, val);
    else
      Update(2 * node + 2, mid + 1, right, pos, val);
    Recalc(node);
  }

  int Query(int node, int left, int right, int x, int y) {
    if (x <= left && right <= y) {
      return tree[node];
    }
    int mid = left + (right - left) / 2;
    int ret = 0;
    if (x <= mid)
      ret = max(ret, Query(2 * node + 1, left, mid, x, y));
    if (mid < y)
      ret = max(ret, Query(2 * node + 2, mid + 1, right, x, y));
    return ret;
  }
};

int main() {
  ifstream cin("arbint.in");
  ofstream cout("arbint.out"); 

  int n, m; cin >> n >> m;
  for (int i = 0; i < n; ++i) {
    cin >> v[i];
  }

  SegmTree::Build(0, 0, n - 1);
  while (m--) {
    int type, a, b; cin >> type >> a >> b;
    if (type == 0) {
      cout << SegmTree::Query(0, 0, n - 1, a - 1, b - 1) << '\n';
    } else {
      SegmTree::Update(0, 0, n - 1, a - 1, b);
    }
  }
}