Cod sursa(job #2975445)

Utilizator etohirseCristi Cretu etohirse Data 6 februarie 2023 15:50:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

ifstream fin("arbint.in", std::ios::in);
ofstream fout("arbint.out", std::ios::out);

static const int mxn = 1e5;

size_t n, q;
vector<int> aib;

void build(size_t nod, int a, int b){
  if (a == b) {
    fin >> aib[nod];
    return;
  }

  int mid = (a + b) / 2;

  build(nod * 2, a, mid);
  build(nod * 2 + 1, mid + 1, b);
  aib[nod] = max(aib[nod * 2], aib[nod * 2 + 1]);
}

int query(size_t nod, int st, int dr, int a, int b){
  if (st >= a && dr <= b) {
    return aib[nod];
  }

  int mid = (st + dr) / 2;
  int ans = 0;
  if (mid >= a) {
    ans = max(ans, query(nod * 2, st, mid, a, b));
  }
  if (b > mid) {
    ans = max(ans, query(nod * 2 + 1, mid + 1, dr, a, b));
  }
  
  return ans; 
}

void update(size_t nod, int st, int dr, int poz, int val){
  if (st == dr) {
    aib[nod] = val;
    return;
  }

  int mid = (st + dr) / 2;
  if (mid >= poz) {
    update(nod * 2, st, mid, poz, val);
  } else {
    update(nod * 2 + 1, mid + 1, dr, poz, val);
  }

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

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

  build(1, 1, n);

  while (q--){
    int c, a , b;
    fin >> c >> a >> b;
    if (c == 0){
      fout << query(1, 1, n, a, b) << '\n';
    } else {
      update(1, 1, n, a, b);
    }
  }
  return 0;
}