Cod sursa(job #1247250)

Utilizator laurenttlaurentiu pavel laurentt Data 22 octombrie 2014 14:53:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

int n,m;
int tree[400100];
ifstream in("arbint.in");
ofstream out("arbint.out");

void update_val(int lo, int hi, int pos, int val, int node) {
  if((lo == hi) && (hi == pos)) {
    tree[node] = val;
    return;
  }
  
  int mid = (lo + hi)/2;

  if(pos <= mid)
    update_val(lo, mid, pos, val, node * 2);
  else
    update_val(mid + 1, hi, pos, val, node*2 + 1);

  tree[node] = max(tree[node*2], tree[node*2 + 1]);
}

int query(int lo, int hi, int a, int b, int node) {
  if((a <= lo) && (hi <= b)) 
    return tree[node];

  int mid = (lo + hi)/2;
  int r = -1;
  if(a <= mid) {
    r = max(r, query(lo, mid, a, b, node*2));
  }
  if(mid < b) {
    r = max(r, query(mid + 1, hi, a, b, node*2 + 1));
  }
  return r;
}


int main() {
  in >> n >> m;
  for(int i = 0; i < n; ++i) {
    int x; in >> x;
    update_val(1, n, i + 1, x, 1);
  }
  for(int i = 0; i < m; ++i) {
    int x,a,b;
    in >> x >> a >> b;
    if(x == 0) {
      out << query(1, n, a, b, 1) << '\n';
    }
    else {
      update_val(1, n, a, b, 1);
    }
  }

  return 0;
}