Cod sursa(job #2055580)

Utilizator alexnekiNechifor Alexandru alexneki Data 3 noiembrie 2017 14:23:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

int n, m, maxx;
int np; //number of internal nodes in the full segment tree
int arbint[4 * (1 + NMAX)];

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

int query(int from, int to) {
  int answer = 0;
  if (from == to)
    answer = arbint[from];
  else if (from < to) {
    if (from % 2 == 1) {
      answer = max(answer, arbint[from]);
      from++;
    }
    if (to % 2 == 0) {
      answer = max(answer, arbint[to]);
      to--;
    }
    int local = query(from / 2, to / 2);
//    cout << from << " " << to << " " << local << endl;
    return max(answer, local);
  }
  return answer;
}

int main() {
  in >> n >> m;

  int pow = 0;
  while ((1 << pow) < n)
    pow++;
  np = (1 << pow) - 1;

  for (int i = 1; i <= n; i++) {
    in >> arbint[np + i];
    update((np + i) / 2);
  }

  for (int i = 1; i <= m; i++) {
    int p, x, y;
    in >> p >> x >> y;
    if (p == 1) {
      arbint[np + x] = y;
      update((np + x) / 2);
    } else {
//      for (int i = 1; i <= np + n; i++)
//        cout << arbint[i] << " ";
      out << query(np + x, np + y) << '\n';
    }
  }

  in.close();
  out.close();
  return 0;
}