Cod sursa(job #2673787)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 17 noiembrie 2020 18:57:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

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

struct Aint {

  Aint(int n) {
    arb.resize(n << 2);
    init(1, n, 1);
  }

  vector < int > arb;

  void init(int st, int dr, int node) {
    if (st == dr) {
      fin >> arb[node];
      return;
    }

    int mid = (st + dr) >> 1;
    int left = node * 2, right = left + 1;

    init(st, mid, left);
    init(mid + 1, dr, right);

    arb[node] = max(arb[left], arb[right]);
  }

  void update(int poz, int val, int st, int dr, int node) {
    if (st == dr) {
      arb[node] = val;
      return;
    }

    int mid = (st + dr) >> 1;
    int left = node * 2, right = left + 1;

    if (poz <= mid) {
      update(poz, val, st, mid, left);
    }
    else {
      update(poz, val, mid + 1, dr, right);
    }

    arb[node] = max(arb[left], arb[right]);
  }

  int query(int qSt, int qDr, int st, int dr, int node) {
    if (qSt <= st and dr <= qDr) {
      return arb[node];
    }

    int mid = (st + dr) >> 1;
    int left = node * 2, right = left + 1;

    int rezSt = -1, rezDr = -1;
    if (qSt <= mid) {
      rezSt = query(qSt, qDr, st, mid, left);
    }
    if (mid + 1 <= qDr) {
      rezDr = query(qSt, qDr, mid + 1, dr, right);
    }

    return max(rezSt, rezDr);
  }
};

int main() {

  int n, m;
  fin >> n >> m;

  Aint aint(n);

  while (m --) {
    int t, a, b;
    fin >> t >> a >> b;

    if (t == 0) {
      fout << aint.query(a, b, 1, n, 1) << '\n';
    }
    else {
      aint.update(a, b, 1, n, 1);
    }
  }
}