Cod sursa(job #2937512)

Utilizator average_disappointmentManolache Sebastian average_disappointment Data 10 noiembrie 2022 16:36:19
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>

using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

const int nmax = 1e5;
int n, m, aint[nmax * 2];

void act(int nod, int loc_left, int loc_right, int left, int right, int val) {

  if (left <= loc_left && loc_right <= right)
    aint[nod] = val;
  else {

    int mid = (loc_left + loc_right) / 2;
    if (left <= mid)
      act(nod * 2, loc_left, mid, left, right, val);
    if (right > mid)
      act(nod * 2 + 1, mid + 1, loc_right, left, right, val);
    aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
  }
}

int querry(int nod, int loc_left, int loc_right, int left, int right) {

  if (left <= loc_left && loc_right <= right)
    return aint[nod];
  else {

    int q = 0, mid = (loc_left + loc_right) / 2;
    if (left <= mid)
      q = max(querry(nod * 2, loc_left, mid, left, right), q);
    if (right > mid)
      q = max(querry(nod * 2 + 1, mid + 1, loc_right, left, right), q);
    return q;
  }
}

int main() {

  cin >> n >> m;
  for (int i = 1; i <= n; i++) {

    int x;
    cin >> x;
    act(1, 1, n, i, i, x);
  }

  for (int i = 1; i <= m; i++) {

    int q, a, b;
    cin >> q >> a >> b;
    if (q == 0) {

      cout << querry(1, 1, n, a, b) << "\n";
    }
    else {

      act(1, 1, n, a, a, b);
    }
  }
}