Cod sursa(job #995567)

Utilizator KatyiaKatyia Katyia Data 9 septembrie 2013 15:02:07
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#define NMAX 1<<18

using namespace std;

int tree[NMAX];
int n,m;

void insert(int left, int right, int position, int number, int index) {
  if (left == right) {
    tree[index] = number;
    return;
  }
 
  int median = (left + right) / 2;
  if (position < median) {
    insert(left, median, position, number, 2 * index);
  } else {
    insert(median + 1, right, position, number, 2 * index + 1); 
  }
  
  if (tree[2 * index] > tree[2 * index + 1]) {
    tree[index] = tree[2 * index];
  } else {
    tree[index] = tree[2 * index + 1];
  } 
}

inline int max(int a, int b) {
  if (a > b) return a;
  return b;
}

int query(int left, int right, int qleft, int qright, int index) { 
  if (qleft <= left && qright >= right) 
    return tree[index];
  
  int median = (left + right) / 2;
  int left_son = 0;
  int right_son = 0;
  if (qleft <= median)
    left_son = query(left, median, qleft, qright, 2 * index);
  if (qright > median)
    right_son = query(median + 1, qleft, qright, 2 * index + 1);
  return max(left_son, right_son);

}

int main() {
  ifstream in("arbint.in");
  ofstream out("arbint.out");
 
  in>>n>>m;  
  int a, b, c;
  for (int i = 1; i <= n; i++) {
    in>>a;
    insert(1, n, i, a, 1);
  }
  for (int i = 1; i <= m; i++) {
    in>>a>>b>>c;
    if (!a) {
      out<<query(1, n, b, c, 1)<<"\n";
    } else {
      insert(1, n, b, c, 1);
    }
  
  }
  return 0;
}