Cod sursa(job #2034618)

Utilizator danny794Dan Danaila danny794 Data 8 octombrie 2017 10:33:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cmath>
#include <cstdio>
#include <vector>

#define MAX -1

struct IntervalTree {
  IntervalTree(int n_) : n(n_) {
    size = 1 << ((int) (std::log(n) / std::log(2)));
    if (size < n) {
      size <<= 1;
    }
    container.resize(size * 2);
  }

  void readData() {
    for (int i = 0; i < n; i++) {
      scanf("%d", &container[size + i]);
    }
    for (int i = n + size; i < 2 * size; i++) {
      container[i] = MAX;
    }
    int aux = size >> 1;;
    while (aux) {
      for (int i = aux; i < 2 * aux; i++) {
        container[i] = container[2 * i + 1];
        if (container[i] < container[2 * i]) {
          container[i] = container[2 * i];
        }
      }
      aux >>= 1;
    }
  }

  void update(int pos, int value) {
    pos = size + pos - 1;
    container[pos] = value;
    do {
      pos >>= 1;
      container[pos] = std::max(container[2 * pos], container[2 * pos + 1]);
    } while (pos);
  }

  int findMax(int a, int b) {
    return findMax(a, b, 1, size, 1);
  }

  int findMax(int a, int b, int left, int right, int pos) {
    if (a == left && b == right) {
      return container[pos];
    }
    int mid = (left + right) >> 1;
    if (a > mid) {
      return findMax(a, b, mid + 1, right, 2 * pos + 1);
    } else if (b <= mid) {
      return findMax(a, b, left, mid, 2 * pos);
    } else {
      return std::max(findMax(a, mid, left, mid, 2 * pos),
                      findMax(mid + 1, b, mid + 1, right, 2 * pos + 1));
    }
  }

  int n;
  int size;
  std::vector<int> container;
};

int main() {
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
  int n, m, op, a, b;
  scanf("%d %d", &n, &m);
  IntervalTree tree(n);
  tree.readData();
  while (m-- > 0) {
    scanf("%d %d %d", &op, &a, &b);
    if (op == 0) {
      printf("%d\n", tree.findMax(a, b));
    } else {
      tree.update(a, b);
    }
  }
  return 0;
}