Cod sursa(job #3127165)

Utilizator retrogradLucian Bicsi retrograd Data 7 mai 2023 13:06:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>

using namespace std;

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

  int n, q; cin >> n >> q;
  vector<int> qt(q), qa(q), qb(q), ans(q);
  vector<int> v(n), iv(n);
  for (int i = 0; i < n; ++i) cin >> iv[i];
  for (int i = 0; i < q; ++i) {
    cin >> qt[i] >> qa[i] >> qb[i];
    --qa[i];
  }
  for (; n; n /= 2) {
    copy(iv.begin(), iv.end(), v.begin());
    for (int i = 0; i < q; ++i) {
      if (qt[i] == 0 && qa[i] < qb[i]) {
        if (qa[i] % 2) ans[i] = max(ans[i], v[qa[i]++]);
        if (qb[i] % 2) ans[i] = max(ans[i], v[--qb[i]]);
        qa[i] /= 2; qb[i] /= 2;
      }
      if (qt[i] == 1) {
        v[qa[i]] = qb[i];
        qb[i] = max(v[qa[i]], v[qa[i] ^ 1]);
        qa[i] /= 2; 
      }
    }
    for (int i = 0; i + 1 < n; i += 2)
      iv[i / 2] = max(iv[i], iv[i + 1]);
  }
  for (int i = 0; i < q; ++i) 
    if (qt[i] == 0)
      cout << ans[i] << "\n";
  return 0;
}