DuongNhi99

SHELF (Segment Tree - Sum)

Nov 30th, 2020 (edited)
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4.  
  5. const int N = 1e5 + 5;
  6.  
  7. int n, m;
  8. ll a[N];
  9. ll t[4 * N];
  10.  
  11. void build(int v, int tl, int tr) {
  12.     if (tl == tr) {
  13.         t[v] = a[tl];
  14.     }
  15.     else {
  16.         int tm = (tl + tr) / 2;
  17.         build(v*2, tl, tm);
  18.         build(v*2+1, tm+1, tr);
  19.         t[v] = t[v*2] + t[v*2+1];
  20.     }
  21. }
  22.  
  23. ll sum(int v, int tl, int tr, int l, int r) {
  24.     if (r < tl || tr < l) return 0;
  25.     if (l <= tl && tr <= r) return t[v];
  26.  
  27.     int tm = (tl + tr) / 2;
  28.     return sum(v*2, tl, tm, l, r) + sum(v*2+1, tm+1, tr, l, r);
  29. }
  30.  
  31. void update(int v, int tl, int tr, int pos) {
  32.     if (tl == tr) {
  33.         ++t[v];
  34.     } else {
  35.         int tm = (tl + tr) / 2;
  36.         if (pos <= tm)
  37.             update(v*2, tl, tm, pos);
  38.         else
  39.             update(v*2+1, tm+1, tr, pos);
  40.         t[v] = t[v*2] + t[v*2+1];
  41.     }
  42. }
  43.  
  44. int main()
  45. {
  46.     //freopen("in.txt", "r", stdin);
  47.     freopen("SHELF.inp", "r", stdin);
  48.     freopen("SHELF.out", "w", stdout);
  49.     ios_base::sync_with_stdio(false);
  50.     cin.tie(NULL); cout.tie(NULL);
  51.  
  52.     cin >> n;
  53.     for(int i = 1; i <= n; ++i)
  54.         cin >> a[i];
  55.  
  56.     build(1, 1, n);
  57.  
  58.     cin >> m;
  59.     for(int i = 1; i <= m; ++i) {
  60.         int x; cin >> x;
  61.  
  62.         ll ans = min(sum(1, 1, n, 1, x - 1), sum(1, 1, n, x + 1, n));
  63.         cout << ans << ' ';
  64.         update(1, 1, n, x);
  65.     }
  66.  
  67.     return 0;
  68. }
  69.  
Add Comment
Please, Sign In to add comment