Cod sursa(job #2271309)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 28 octombrie 2018 13:18:40
Problema Heavy Path Decomposition Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
#include <algorithm>

class SegmentTree {
public:
  int value;
  int leftIndex;
  int rightIndex;
  SegmentTree* left;
  SegmentTree* right;
  
  void build(int nodeLeft, int nodeRight) {
    leftIndex = nodeLeft;
    rightIndex = nodeRight;
    int mid = (nodeLeft + nodeRight) >> 1;
    if (leftIndex != rightIndex) {
      left = new SegmentTree;
      left->build(nodeLeft, mid);
      right = new SegmentTree;
      right->build(mid + 1, nodeRight);
    }
  }
  
  void update(int pos, int newValue) {
    if (leftIndex == rightIndex)
      value = newValue;
    else {
      int mid = (leftIndex + rightIndex) >> 1;
      if (pos <= mid)
        left->update(pos, newValue);
      else
        right->update(pos, newValue);
      value = std::max(left->value, right->value);
    }
  }
  
  int query(int qLeft, int qRight) {
    if (qLeft <= leftIndex && rightIndex <= qRight)
      return value;
    else {
      int mid = (leftIndex + rightIndex) >> 1;
      int ans = 0;
      if (qLeft <= mid)
        ans = std::max(ans, left->query(qLeft, qRight));
      if (qRight > mid)
        ans = std::max(ans, right->query(qLeft, qRight));
      return ans;
    }
  }
};

SegmentTree* root = new SegmentTree;

int main() {
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
  
  int n, m;
  scanf("%d%d", &n, &m);
  root->build(1, n);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    root->update(i, x);
  }
  for (int i = 1; i <= m; i++) {
    int t, a, b;
    scanf("%d%d%d", &t, &a, &b);
    if (t == 0) {
      printf("%d\n", root->query(a, b));
    } else {
      root->update(a, b);
    }
  }
  return 0;
}