Cod sursa(job #3157316)

Utilizator victorzarzuZarzu Victor victorzarzu Data 15 octombrie 2023 12:32:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

#define N_MAX 100000
ifstream f("arbint.in");
ofstream g("arbint.out");

int n, m;
int arb[4 * N_MAX + 5];

void update(const int& node, const int& left, const int& right, const int& pos, const int& val) {
  if(left > right || pos < left || right < pos) {
    return;
  }

  if(left == right) {
    arb[node] = val;
    return;
  }

  int mid = (left + right) >> 1;
  update(2 * node, left, mid, pos, val);
  update(2 * node + 1, mid + 1, right, pos, val);
  arb[node] = max(arb[2 * node], arb[2 * node + 1]);
}

int query(const int& node, const int& left, const int& right, const int& a, const int& b) {
  if(left > right || left > b || right < a) {
    return 0;
  }

  if(a <= left && right <= b) {
    return arb[node];
  } 

  int mid = (left + right) >> 1;
  return max(query(2 * node, left, mid, a, b), query(2 * node + 1, mid + 1, right, a, b));
}

void read() {
  int x;
  f>>n>>m;
  for(int i = 1;i <= n;++i) {
    f>>x;
    update(1, 1, n, i, x);
  }
}

void solve() {
  int x, y, z;
  for(int i = 1;i <= m;++i) {
    f>>x>>y>>z;
    if(!x) {
      g<<query(1, 1, n, y, z)<<'\n';
      continue;
    }
    update(1, 1, n, y, z);
  }
  f.close();
  g.close();
}

int main() {
  
  read();
  solve();

  return 0;
}