Cod sursa(job #2354159)

Utilizator lflorin29Florin Laiu lflorin29 Data 24 februarie 2019 22:33:45
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

struct SegmentTree {
  vector<int>aint;
  SegmentTree(int n = 1) {
    aint.resize(2 * n - 1);
  }
  void update(int x, int l, int r, int at, int with) {
    if(l == r) {
      aint[x] = with;
      return;
    }
    int m = (l + r) >> 1;
    int lson = x + 1, rson = x + ((m - l + 1) << 1);
    if(at <= m)
      update(lson, l, m, at, with);
    else
      update(rson, m + 1, r, at, with);
    aint[x] = max(aint[lson], aint[rson]);
  }
  int query(int x, int l, int r, int ll, int rr) {
    if(ll > r || l > rr)
      return 0;
    if(l >= ll && r <= rr) {
      return aint[x];
    }
    int m = (l + r) >> 1;
    int lson = x + 1, rson = x + ((m - l + 1) << 1);
    return max(query(lson, l, m, ll, rr), query(rson, m + 1, r, ll, rr));
  }
};
int main() {
  ifstream cin("arbint.in");
  ofstream cout("arbint.out");

  int n, m;
  cin >> n >> m;
  SegmentTree aintmax(n);
  for(int i = 0, x; i < n; ++i) {
    cin >> x;
    aintmax.update(1, 0, n - 1, i, x);
  }
  for(int i = 0; i < m; ++i) {
    int t, a, b;
    cin >> t >> a >> b;
    if(t == 0) cout << aintmax.query(1, 0, n - 1, a - 1, b - 1) << '\n';
    else aintmax.update(1, 0, n - 1, a - 1, b);
  }
  return 0;}