Cod sursa(job #2488775)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 7 noiembrie 2019 16:58:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

const int MAX_N = 100005;

int n, m;
int tree[MAX_N * 4];

inline void update(int u, int lo, int ri, int pos, int value) {
  int mid = (lo + ri) / 2;
  if (lo > ri) {
    return;
  }
  if (lo == ri) {
    tree[u] = value;
    return;
  }
  if (mid >= pos) {
    update(2 * u, lo, mid, pos, value);
  } else {
    update(2 * u + 1, mid + 1, ri, pos, value);
  }
  tree[u] = std::max(tree[2 * u], tree[2 * u + 1]);
}

inline int query(int u, int lo, int ri, int st, int en) {
  int mid = (lo + ri) / 2;
  if (lo > ri) {
    return INT_MIN;
  }
  if (lo >= st && ri <= en) {
    return tree[u];
  }
  if (mid >= en) {
    return query(2 * u, lo, mid, st, en);
  } else if (mid < st) {
    return query(2 * u + 1, mid + 1, ri, st, en);
  } else {
    return std::max(query(2 * u, lo, mid, st, en), query(2 * u + 1, mid + 1, ri, st, en));
  }
}

int main() {
  int value, op_type, pos, lo, ri;
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &value);
    update(1, 1, n, i, value);
  }
  while (m --) {
    scanf("%d", &op_type);
    if (op_type == 0) {
      scanf("%d %d", &lo, &ri);
      printf("%d\n", query(1, 1, n, lo, ri));
    } else {
      scanf("%d %d", &pos, &value);
      update(1, 1, n, pos, value);
    }
  }
#ifdef LOCAL_DEFINE
  std::cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
  return 0;
}