Advertisement
georgiy110802

Сшка

Jan 31st, 2022
932
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> pii;
  7.  
  8. void mcin() {}
  9.  
  10. template<typename T, typename ...Tail>
  11. void mcin(T &&arg, Tail &&...args) {
  12.     cin >> arg;
  13.     mcin(args...);
  14. }
  15. #define in(type, ...) type __VA_ARGS__; mcin(__VA_ARGS__);
  16.  
  17. template<typename T1, typename T2>
  18. istream &operator>>(istream &in, pair<T1, T2> &p) {
  19.     return in >> p.first >> p.second;
  20. }
  21.  
  22. template<typename T>
  23. istream &operator>>(istream &in, vector<T> &v) {
  24.     for (auto &item: v)
  25.         in >> item;
  26.     return in;
  27. }
  28.  
  29. #define all(c) c.begin(), c.end()
  30.  
  31. int main() {
  32.    
  33.     ios_base::sync_with_stdio(false);
  34.     cin.tie(nullptr);
  35.     cout.tie(nullptr);
  36.  
  37.     in(int, n, x, y)
  38.     vector<pair<int, int>> a(n);
  39.     cin >> a;
  40.  
  41.     function<ll(int, int)> solve = [&](int l, int r) {
  42.         if (r - l == 1) {
  43.             int len = a[l].second - a[l].first;
  44.             return len >= x && len <= y ? 1ll : 0ll;
  45.         }
  46.  
  47.         int m = (l + r) / 2;
  48.         ll res = solve(l, m) + solve(m, r);
  49.  
  50.         vector<int> rl(r - m), rr(r - m);
  51.         rl[0] = a[m].first, rr[0] = a[m].second;
  52.         for (int i = m + 1; i < r; i++) {
  53.             rl[i - m] = max(rl[i - m - 1], a[i].first);
  54.             rr[i - m] = min(rr[i - m - 1], a[i].second);
  55.         }
  56.  
  57.         int ll = 0, lr = 1e9;
  58.         auto len = [&](int ptr) {
  59.             return max(0, min(lr, rr[ptr]) - max(ll, rl[ptr]));
  60.         };
  61.         int ptr1 = r - m - 1, ptr2 = r - m - 1;
  62.         for (int i = m - 1; i >= l; i--) {
  63.             ll = max(ll, a[i].first);
  64.             lr = min(lr, a[i].second);
  65.             while (ptr1 >= 0 && len(ptr1) <= y) ptr1--;
  66.             while (ptr2 >= 0 && len(ptr2) < x) ptr2--;
  67.             res += ptr2 - ptr1;
  68.         }
  69.  
  70.         return res;
  71.     };
  72.  
  73.     cout << solve(0, n) << '\n';
  74.  
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement