Cod sursa(job #2257333)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 9 octombrie 2018 22:47:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

struct SegTree {
  int n;
  int* a;

  SegTree(int x) {
    n = x;
    a = new int [4 * n + 5];
    memset(a, 0, sizeof(a));
  }

  void build(vector<int>v) {
    for (int i = 1; i <= n; ++i)
      u(1, 1, n, i, v[i - 1]);
  }

  void update(int poz, int val) {
    u(1, 1, n, poz, val);
  }

  int query(int st, int dr) {
    return q(1, 1, n, st, dr);
  }

  void u(int node, int st, int dr, int poz, int val) {
    if (st == dr) {
      a[node] = val;
      return ;
    }
    int med = (st + dr) >> 1;
    if (med >= poz)
      u(2 * node, st, med, poz, val);
    else
      u(2 * node + 1, med + 1, dr, poz, val);
    a[node] = max(a[2 * node], a[2 * node + 1]);
  }

  int q(int node, int st, int dr, int l, int r) {
    if (l <= st && dr <= r)
      return a[node];
    int ans = 0;
    int med = (st + dr >> 1);
    if (l <= med)
      ans = q(2 * node, st, med, l, r);
    if (r > med)
      ans = max(ans, q(2 * node + 1, med + 1, dr, l, r));
    return ans;
  }
};

int main(){
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);

  int n, m;
  scanf("%d%d", &n, &m);
  vector<int>v;
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    v.push_back(x);
  }

  SegTree a(n);
  a.build(v);
  for (int i = 1; i <= m; ++i) {
    int t, x, y;
    scanf("%d%d%d", &t, &x, &y);
    if (t == 0)
      printf("%d\n", a.query(x, y));
    else
      a.update(x, y);
  }




  return 0;
}