Cod sursa(job #1424126)

Utilizator andreiagAndrei Galusca andreiag Data 23 aprilie 2015 16:03:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>

#define I(x) ((x)&-(x))
using namespace std;
const int INF = 100000888;
const int Nmax = 100555;

int N, M;
int v[Nmax];
int A[Nmax];

int max(int x, int y) { return x > y ? x : y; }

int Query(int l, int h) {
  int p, m = 0, q = 0;
  while (h >= l) {
    p = h - I(h);
    if (p+1 >= l) {
      q = A[h];
      h = p;
    } else {
      q = h;
      h--;
    }
    if (v[m] < v[q])
      m = q;
  }
  return m;
}


void Update(int pos, int val) {
  v[pos] = val;
  int p = pos;
  while (p <= N) {
    if (A[p] == pos) {
      int q = Query(p - I(p) + 1, p-1);
      A[p] = v[q] > v[p] ? q : p;
    } else if (v[A[p]] < val) {
            A[p] = pos;
    }
    p += I(p);
  }
}


int main()
{
  ifstream f ("arbint.in");
  ofstream g ("arbint.out");
  
  int x, a, b;
  v[0] = -INF;
  f >> N >> M;
  for (int i = 1; i <= N; i++) {
    f >> a;
    Update(i, a);
  }
  
  while (M--) {
    f >> x >> a >> b;
    if (x == 1)
      Update(a, b);
    else if (x == 0)
      g << v[Query(a, b)] << '\n';
  }
  

  return 0;
}