Advertisement
YEZAELP

TOI13: art (Fenwick)

Jul 20th, 2021
1,032
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define F first
  5. #define S second
  6. using lli = long long;
  7. using pi = pair <int, int>;
  8. using piI = pair <int, pi>;
  9. const int N = 1e6 + 10;
  10. const int INF = 1e9;
  11. vector <piI> event;
  12. int tree[N];
  13. int n, t;
  14.  
  15. void Update(int pos, int val){
  16.     for(int i = pos; i <= N - 10; i += i & -i)
  17.         tree[i] += val;
  18. }
  19.  
  20. int Sum(int pos, int sum = 0){
  21.     for(int i = pos; i > 0; i -= i & -i)
  22.         sum += tree[i];
  23.     return sum;
  24. }
  25.  
  26. int Min(int l = 1, int r = N - 10, int mn = INF){
  27.     while(l <= r){
  28.         int mid = (l + r) / 2;
  29.         if(Sum(mid) == t)
  30.             r = mid - 1, mn = min(mn, mid);
  31.         else if(Sum(mid) > t)
  32.             l = mid + 1;
  33.         else
  34.             r = mid - 1;
  35.     }
  36.     return mn;
  37. }
  38.  
  39. int Max(int l = 1, int r = N - 10, int mx = -INF){
  40.     while(l <= r){
  41.         int mid = (l + r) / 2;
  42.         if(Sum(mid) == t)
  43.             l = mid + 1, mx = max(mx, mid);
  44.         else if(Sum(mid) >= t)
  45.             l = mid + 1;
  46.         else
  47.             r = mid - 1;
  48.     }
  49.     return mx;
  50. }
  51.  
  52. int Cal(){
  53.     int mn = Min();
  54.     if(mn == INF) return 0;
  55.     int mx = Max();
  56.     return mx - mn + 1;
  57. }
  58.  
  59. int main(){
  60.  
  61.     scanf("%d%d", &n, &t);
  62.  
  63.     for(int i=1;i<=n;i++){
  64.         int s, h, w, o;
  65.         scanf("%d%d%d%d", &s, &h, &w, &o);
  66.         event.push_back({ s , {h, o} });
  67.         event.push_back({ s + w , {h, -o} });
  68.     }
  69.  
  70.     sort(event.begin(), event.end());
  71.  
  72.     int prevx = -1, prevh = -1;
  73.     lli ans = 0;
  74.     for(auto e: event){
  75.         int x = e.F;
  76.         int h = e.S.F;
  77.         int c = e.S.S;
  78.  
  79.         if(prevx != -1)
  80.             ans += (lli)( (lli)(x - prevx) * (lli)Cal() );
  81.  
  82.         Update(1, c);
  83.         Update(h + 1, -c);
  84.  
  85.         prevx = x;
  86.     }
  87.  
  88.     printf("%lld\n", ans);
  89.  
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement