Advertisement
Alex_tz307

USACO 2015 December Contest, Platinum Problem 3. Counting Haybales

May 30th, 2021
923
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define INF 0x3f3f3f3f
  4.  
  5. using namespace std;
  6.  
  7. ifstream fin("haybales.in");
  8. ofstream fout("haybales.out");
  9.  
  10. void min_self(int &x, int y) {
  11.   x = min(x, y);
  12. }
  13.  
  14. struct SegTree {
  15.   int Size;
  16.   vector<int> mn, sum, lazy;
  17.  
  18.   SegTree(int N) {
  19.     Size = 1;
  20.     while (Size < N)
  21.       Size <<= 1;
  22.     mn.resize(Size << 1);
  23.     sum.resize(Size << 1);
  24.     lazy.resize(Size << 1);
  25.   }
  26.  
  27.   void build(int x, int lx, int rx) {
  28.     if (lx == rx) {
  29.       fin >> mn[x];
  30.       sum[x] = mn[x];
  31.       return;
  32.     }
  33.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  34.     build(lSon, lx, mid);
  35.     build(rSon, mid + 1, rx);
  36.     mn[x] = min(mn[lSon], mn[rSon]);
  37.     sum[x] = sum[lSon] + sum[rSon];
  38.   }
  39.  
  40.   void push(int x, int lx, int rx) {
  41.     if (lazy[x] == 0)
  42.       return;
  43.     int mid = (lx + rx) >> 1;
  44.     int l[] = {mid - lx + 1, rx - mid};
  45.     for (int i = 0; i < 2; ++i) {
  46.       int son = x << 1 | i;
  47.       mn[son] += lazy[x];
  48.       sum[son] += l[i] * lazy[x];
  49.       lazy[son] += lazy[x];
  50.     }
  51.     lazy[x] = 0;
  52.   }
  53.  
  54.   void update(int x, int lx, int rx, int st, int dr, int val) {
  55.     if (st <= lx && rx <= dr) {
  56.       mn[x] += val;
  57.       sum[x] += (rx - lx + 1) * val;
  58.       lazy[x] += val;
  59.       return;
  60.     }
  61.     push(x, lx, rx);
  62.     int mid = (lx + rx) >> 1, lSon = x << 1, rSon = x << 1 | 1;
  63.     if (st <= mid)
  64.       update(lSon, lx, mid, st, dr, val);
  65.     if (mid < dr)
  66.       update(rSon, mid + 1, rx, st, dr, val);
  67.     mn[x] = min(mn[lSon], mn[rSon]);
  68.     sum[x] = sum[lSon] + sum[rSon];
  69.   }
  70.  
  71.   int query_min(int x, int lx, int rx, int st, int dr) {
  72.     if (st <= lx && rx <= dr)
  73.       return mn[x];
  74.     push(x, lx, rx);
  75.     int mid = (lx + rx) >> 1, ans = INF;
  76.     if (st <= mid)
  77.       min_self(ans, query_min(x << 1, lx, mid, st, dr));
  78.     if (mid < dr)
  79.       min_self(ans, query_min(x << 1 | 1, mid + 1, rx, st, dr));
  80.     return ans;
  81.   }
  82.  
  83.   int query_sum(int x, int lx, int rx, int st, int dr) {
  84.     if (st <= lx && rx <= dr)
  85.       return sum[x];
  86.     push(x, lx, rx);
  87.     int mid = (lx + rx) >> 1, ans = 0;
  88.     if (st <= mid)
  89.       ans += query_sum(x << 1, lx, mid, st, dr);
  90.     if (mid < dr)
  91.       ans += query_sum(x << 1 | 1, mid + 1, rx, st, dr);
  92.     return ans;
  93.   }
  94. };
  95.  
  96. int32_t main() {
  97.   int N, Q;
  98.   fin >> N >> Q;
  99.   SegTree tree(N);
  100.   tree.build(1, 1, N);
  101.   for (int q = 0; q < Q; ++q) {
  102.     char t;
  103.     int l, r;
  104.     fin >> t >> l >> r;
  105.     if (t == 'P') {
  106.       int C;
  107.       fin >> C;
  108.       tree.update(1, 1, N, l, r, C);
  109.       continue;
  110.     }
  111.     if (t == 'M')
  112.       fout << tree.query_min(1, 1, N, l, r) << '\n';
  113.     else fout << tree.query_sum(1, 1, N, l, r) << '\n';
  114.   }
  115.   return 0;
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement