Cod sursa(job #2647986)

Utilizator educationalLets Go educational Data 7 septembrie 2020 18:41:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.18 kb
#include <bits/stdc++.h>
using namespace std;

const int inf = 1 << 30;

class LazySeg {
   int sz;
   vector<int> data;
   vector<int> lazy;
   public:
   LazySeg(int _sz) {
      sz = 1;
      while (sz < _sz) sz *= 2;
      data = vector<int>(sz * 2);
      lazy = vector<int>(sz * 2);
   }
   // BUILD
   void build(vector<int> &ar, int cur, int l, int r) {
      if (l + 1 == r) {
         data[cur] = ar[l];
      } else {
         int mid = (l + r) / 2;
         int cl = cur * 2, cr = cur * 2 + 1;
         build(ar, cl, l, mid);
         build(ar, cr, mid, r);
         data[cur] = min(data[cl], data[cr]);
      }
   }
   void build(vector<int> &ar) {
      build(ar, 1, 0, sz);
   }
   void down(int cur) {
      int cl = cur * 2, cr = cur * 2 + 1;
      int diff = lazy[cur];
      data[cl] += diff;
      data[cr] += diff;
      lazy[cl] += lazy[cur];
      lazy[cr] += lazy[cur];
      lazy[cur] = 0;
   }
   // QUERY
   int query(int left, int right, int cur, int l, int r) {
      if (left <= l && r <= right) {
         return data[cur];
      } else if (left >= r || l >= right) {
         return inf;
      } else {
         down(cur);
         int mid = (l + r) / 2;
         int cl = cur * 2, cr = cur * 2 + 1;
         int ql = query(left, right, cl, l, mid);
         int qr = query(left, right, cr, mid, r);
         return min(ql, qr);
      }
   }
   int query(int left, int right) {
      return query(left, right, 1, 0, sz);
   }
   // ADD
   void add(int left, int right, int val, int cur, int l, int r) {
      if (left <= l && r <= right) {
         lazy[cur] += val;
         data[cur] += val;
      } else if (left >= r || l >= right) {
      } else {
         down(cur);
         int mid = (l + r) / 2;
         int cl = cur * 2, cr = cur * 2 + 1;
         add(left, right, val, cl, l, mid);
         add(left, right, val, cr, mid, r);
         data[cur] = min(data[cl], data[cr]);
      }
   }
   // UPDATE
   void update(int idx, int val, int cur, int l, int r) {
      if (idx < l || idx >= r) {
         return;
      }
      if (l + 1 == r) {
         data[cur] = val;
      } else {
         down(cur);
         int mid = (l + r) / 2;
         int cl = cur * 2, cr = cur * 2 + 1;
         update(idx, val, cl, l, mid);
         update(idx, val, cr, mid, r);
         data[cur] = min(data[cl], data[cr]);
      }
   }
   void add(int left, int right, int val) {
      add(left, right, val, 1, 0, sz);
   }
   void update(int idx, int val) {
      update(idx, val, 1, 0, sz);
   }
};

vector <int> vec;
int N, M;

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


    int i, n, x, y, op;

    scanf ("%d %d", &N, &M);
    for (n = 1; n < N; n *= 2);
    for (i = 1; i <= N; i++) {
        scanf ("%d", &x);
        vec.push_back(-x);
    }

    LazySeg seg(n);
    seg.build(vec);
    for (i = 1; i <= M; i++) {
        scanf ("%d %d %d", &op, &x, &y);
        if (op == 0) {
            --x; --y;
            printf ("%d\n", -seg.query(x, y + 1));
        } else {
            --x;
            seg.update(x, -y);
        }
    }



return 0;
}