Cod sursa(job #2984276)

Utilizator etohirseCristi Cretu etohirse Data 23 februarie 2023 20:20:11
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

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

int n, m;
vector<int> aib;

void Build(int lb, int rb, int node) {
  if (lb == rb) {
    fin >> aib[node];
    return;
  }

  int mb = (lb + rb) / 2;

  Build(lb, mb, node * 2);
  Build(mb + 1, rb, node * 2 + 1);

  aib[node] = max(aib[node * 2], aib[node * 2 + 1]);
}

int query(int lb, int rb, int a, int b, int node) {
  if (a <= lb && b >= rb) {
    return aib[node];
  }

  int mb = (lb + rb) / 2;
  int ans(0);

  if (a <= mb) {
    ans = max(ans, query(lb, mb, a, b, node * 2));
  }
  if (b > mb) {
    ans = max(ans, query(mb + 1, rb, a, b, node * 2 + 1));
  }

  return ans;
}

void update(int lb, int rb, int poz, int val, int node) {
  if (lb == rb) {
    aib[node] = val;
    return;
  }

  int mb = (lb + rb) / 2;

  if (mb >= poz) {
    update(lb, mb, poz, val, node * 2);
  } else {
    update(mb + 1, rb, poz, val, node * 2 + 1);
  }

  aib[node] = max(aib[node * 2], aib[node * 2 + 1]);
  return;
}

int main() {
  fin >> n >> m;
  aib.resize(4 * n);

  Build(1, n, 1);

  while (m--) {
    int q, a, b;

    fin >> q >> a >> b;

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