SuitNdtie

Magnet PROG1029

Apr 18th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef long long int ll;
  6. typedef pair<ll,ll> pll;
  7.  
  8. typedef struct{ // [l,r)
  9.     ll l,r,cnt;
  10. }lenght;
  11.  
  12. int main()
  13. {
  14.     ll n;
  15.     int m,k;
  16.     scanf("%lld %d %d",&n,&m,&k);
  17.    
  18.     vector<pll> vec;
  19.     for(int i=0;i<m;i++){
  20.         ll l,r;
  21.         scanf("%lld %lld",&l,&r);
  22.         vec.push_back({l,1});
  23.         vec.push_back({l+r,-1});
  24.     }
  25.     sort(vec.begin(),vec.end());
  26.    
  27.     vector<lenght> ans;
  28.     ll sum = 0;
  29.     ll previndex = 1;
  30.     vector<lenght> all;
  31.     for(ll i = 0 ; i < vec.size() ; i ++){
  32.         if(vec[i].first != previndex){
  33.             all.push_back({previndex,vec[i].first,sum % 2});
  34.             previndex = vec[i].first;
  35.         }
  36.         if(all.size() > 2){
  37.             if(all[all.size() - 3].cnt == all[all.size() - 2].cnt){
  38.                 all[all.size() - 3].r = all[all.size() - 2].r;
  39.                 lenght temp = all[all.size() - 1];
  40.                 all.pop_back();
  41.                 all.pop_back();
  42.                 all.push_back(temp);
  43.             }
  44.         }
  45.         sum += vec[i].second;
  46.     }
  47.     all.push_back({previndex,n + 1,sum % 2});
  48.     ll index = 0;
  49.     while(index + 1 < all.size()){
  50.         if(all[index].cnt == all[index + 1].cnt){
  51.             all[index].r = all[index+1].r;
  52.             all.erase(all.begin() + index + 1);
  53.         }
  54.         else{
  55.             index++;
  56.         }
  57.     }
  58.     for(int i = 0 ; i < k ; i ++){
  59.         ll q;
  60.         scanf("%lld",&q);
  61.         ll l = 0,r = all.size() - 1;
  62.         while(l <= r){
  63.             ll m = (l + r)/2;
  64.             ll beg = all[m].l;
  65.             ll end = all[m].r;
  66.             if(beg <= q && q < end){
  67.                 printf("%lld\n",end - beg);
  68.                 break;
  69.             }
  70.             else if(q < beg){
  71.                 r = m - 1;
  72.             }
  73.             else if(q >= end){
  74.                 l = m + 1;
  75.             }
  76.         }
  77.     }
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment