Cod sursa(job #2538278)

Utilizator stormy_weatherelena cristina stormy_weather Data 4 februarie 2020 17:00:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;

void act(vector <int> &arb_max, int node, int start_int, int end_int, int pos, int val) {
  if (start_int == end_int) {
    arb_max[node] = val;
    return;
  }

  int middle_int = (start_int + end_int) / 2;
  if (pos <= middle_int)
    act(arb_max, 2 * node, start_int, middle_int, pos, val);
  else
    act(arb_max, 2 * node + 1, middle_int + 1, end_int, pos, val);
  arb_max[node] = max(arb_max[2 * node], arb_max[2 * node + 1]);
}

void ask(vector <int> &arb_max, int node, int start_int, int end_int, int start, int end, int &maxi) {
  if (start_int >= start && end_int <= end) {
    maxi = max(maxi, arb_max[node]);
    return;
  }

  int middle_int = (start_int + end_int) / 2;
  if (middle_int >= start)
    ask(arb_max, 2 * node, start_int, middle_int, start, end, maxi);
  if (middle_int < end)
    ask(arb_max, 2 * node + 1, middle_int + 1, end_int, start, end, maxi);
}

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

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

  int max_int = 4 * n;
  vector <int> values(n), arb_max(max_int + 1, -1);
  for (int i = 0; i < n; i++) {
    fin >> values[i];
    act(arb_max, 1, 1, n, i + 1, values[i]);
  }

  for (int i = 0; i < m; i++) {
    int a, b, c;
    fin >> a >> b >> c;
    if (a == 0) {
      int m = -1;
      ask(arb_max, 1, 1, n, b, c, m);
      fout << m << "\n";
    } else if (a == 1) {
      act(arb_max, 1, 1, n, b, c);
    }
  }

  return 0;
}