Cod sursa(job #2058334)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 5 noiembrie 2017 14:59:39
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

int const nmax = 100000;

int arb[4 * nmax + 4],n, m;

void update(int tata) {
  if(0 < tata) {
    arb[tata] = max(arb[2 * tata], arb[2 * tata + 1]);
    update(tata / 2);
  }
}

int query(int st, int dr) {
  int answer = 0;
  if(st == dr) {
    answer = arb[st];
  } else if(st < dr) {
    if(st % 2 == 1) {
      answer = max(answer, arb[st]);
      st++;
    }
    if(dr % 2 == 0) {
      answer = max(answer, arb[dr]);
      dr--;
    }
    answer = max(answer, query(st / 2, dr / 2));
  }
  return answer;
}

int main() {
    in >> m>> n;
  int p = 1;
  while((1<<p) < n)
    p++;
  int ni = (1<<p) - 1;

  for(int i=1; i<=m; i++) {
    in >> arb[ni + i];
    update((ni + i) / 2);
  }

  for(int i = 1; i <= n; ++ i) {
    int tip, a, b;
    in >> tip >> a >> b;
    if(tip == 0) {
      out <<  query(ni + a, ni + b) << '\n';
    } else {
      arb[ni + a] = b;b;
      update((ni + a) / 2);
    }
  }
  return 0;
}