Advertisement
CyberN00b

МКОШП Задача I ТВ (test 1)

Nov 2nd, 2020 (edited)
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define LINT long long int
  3. #define ULINT unsigned long long int
  4. using namespace std;
  5. class Type{
  6.  public:
  7.      set<pair<pair<LINT, LINT>, LINT>> s;
  8.      pair<LINT, LINT> p;
  9. };
  10. int main() {
  11.     int n, m;
  12.     cin >> n;
  13.     vector<pair<LINT, LINT>> vc(n);
  14.     for (auto& x : vc) {
  15.         cin >> x.first >> x.second;
  16.     }
  17.     vector<Type> res(n);
  18.     res[n - 1].p = vc[n - 1];
  19.     res[n - 1].s.insert({vc[n - 1], n - 1});
  20.     for (int i = n - 2; i >= 0; --i) {
  21.         res[i].s = res[i + 1].s;
  22.         auto it = res[i].s.lower_bound({{vc[i].second, -1}, -1});
  23.         if (it == res[i].s.begin()) {
  24.             if (it != res[i].s.end()) {
  25.                 if ((*it).first.first == vc[i].second) {
  26.                     LINT t = (*it).first.second;
  27.                     res[i].s.erase(it);
  28.                     res[i].s.insert({{vc[i].first, t}, i});
  29.                     res[i].p = {vc[i].first, t};
  30.                     continue;
  31.                 }
  32.             } else
  33.                 continue;
  34.         } else
  35.             it--;
  36.         auto mn = it;
  37.         if (!((*it).first.first <= vc[i].second && (*it).first.second >= vc[i].second)) {
  38.             res[i].s.insert({vc[i], i});
  39.             res[i].p = vc[i];
  40.         } else {
  41.             it--;
  42.             while ((*it).first.first <= vc[i].second && (*it).first.second >= vc[i].second) {
  43.                 if ((*it).second < (*mn).second)
  44.                     mn = it;
  45.                 if (it != res[i].s.begin())
  46.                     it--;
  47.                 else
  48.                     break;
  49.             }
  50.             LINT t = (*mn).first.second;
  51.             res[i].s.erase(mn);
  52.             res[i].p = {vc[i].first, t};
  53.             res[i].s.insert({{vc[i].first, t}, i});
  54.         }
  55.     }
  56.     cin >> m;
  57.     LINT tmp1, tmp2;
  58.     for (int i = 0; i < m; ++i) {
  59.         cin >> tmp1 >> tmp2;
  60.         tmp2--;
  61.         if (res[tmp2].p.first <= tmp1 && tmp1 <= res[tmp2].p.second)
  62.             cout << res[tmp2].p.second - tmp1 << endl;
  63.         else {
  64.             bool f = false;
  65.             auto it = res[i].s.upper_bound({{vc[i].second, -1}, -1});
  66.             it--;
  67.             auto mn = it;
  68.              while ((*it).first.first <= tmp1 && (*it).first.second >= tmp1) {
  69.                 f = true;
  70.                 if ((*it).second < (*mn).second)
  71.                     mn = it;
  72.                 if (it != res[i].s.begin())
  73.                     it--;
  74.                 else
  75.                     break;
  76.             }
  77.             if (f)
  78.                 cout << (*mn).first.second - tmp1 << endl;
  79.             else
  80.                 cout << 0 << endl;
  81.         }
  82.     }
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement