Cod sursa(job #2892768)

Utilizator cadmium_Voicu Mihai-Valeriu cadmium_ Data 23 aprilie 2022 15:55:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.74 kb
#include <bits/stdc++.h>

using namespace std;

#define cin fin
#define cout fout
ifstream cin("arbint.in");
ofstream cout("arbint.out");

const int nmax = 1e5 + 5;

template<typename Node, typename Lazy, int NMAX> struct AINT {
  Node aint[NMAX * 4];
  Lazy lazy[NMAX * 4];
  Node Nid;
  Lazy Lid;
  int *N;
  AINT(Node A, Lazy B, int nprim): Nid(A), Lid(B), N(&nprim) {;}
  void constr(int l, int r, Node *v, bool ok = 1, int node = 1, int cl = 1, int cr = NMAX) {
    int mid = cl + cr >> 1;
    switch (ok) {
      case 0: {
        if(cl == cr) {
          aint[node] = v[cl];
          return;
        }
        if(cr < l || r < cl)
          return;
        break;
      }
      
      case 1: {
        if(l <= cl && cr <= r) {
          constr(l, r, v, 0, node, cl, cr);
          return;
        }
        if(cr < l || r < cl)
          return;
        break;
      }
    }
    constr(l, r, v, ok, 2 * node, cl, mid);
    constr(l, r, v, ok, 2 * node + 1, mid + 1, cr);
    aint[node] = aint[2 * node] + aint[2 * node + 1];
  }
  void updp(int poz, Node val, int node = 1, int cl = 1, int cr = NMAX) {
    if(cl == cr) {
      aint[node] = val;
      return;
    }
    int mid = cl + cr >> 1;
    if(poz <= mid)
      updp(poz, val, 2 * node, cl, mid);
    else
      updp(poz, val, 2 * node + 1, mid + 1, cr);
    aint[node] = aint[2 * node] + aint[2 * node + 1];
  }
  void apply(int node, bool prop) {
    aint[node] += lazy[node];
    if(prop)
      lazy[2 * node] += lazy[node],
      lazy[2 * node + 1] += lazy[node];
    lazy[node] = Lid;
  }
  void updr(int l, int r, Lazy val, int node = 1, int cl = 1, int cr = NMAX) {
    apply(node, cl != cr);
    if(cr < l || r < cl)
      return;
    if(l <= cl && cr <= r) {
      lazy[node] += val;
      apply(node, cl != cr);
      return;
    }
    int mid = cl + cr >> 1;
    updr(l, r, val, 2 * node, cl, mid);
    updr(l, r, val, 2 * node + 1, mid + 1, cr);
    aint[node] = aint[2 * node] + aint[2 * node + 1];
  }
  Node query(int l, int r, int node = 1, int cl = 1, int cr = NMAX) {
    if(cr < l || r < cl)
      return Nid;
    if(l <= cl && cr <= r) {
      return aint[node];
    }
    int mid = cl + cr >> 1;
    return query(l, r, 2 * node, cl, mid) + query(l, r, 2 * node + 1, mid + 1, cr);
  }
};

struct _int {
  int x;
  _int operator +(const _int& y) const {
    return _int{max(x, y.x)};
  }
  _int operator +(const int& y) const {
    return (*this);
  }
};
_int v[nmax];

int main() {
   int n, m;
  cin >> n >> m;
  for(int i = 1, x; i <= n; i++) {
    cin >> x;
    v[i].x = x;
  }
  AINT<_int, int, nmax> aint(_int{0}, 0, n);
  aint.constr(1, n, v);
  for(int i = 0, t, a, b; i < m; i++) {
    cin >> t >> a >> b;
    if(t == 0)
      cout << aint.query(a, b).x << '\n';
    else
      aint.updp(a, _int{b});
  }
}