Advertisement
YEZAELP

CUBE-195: Infinite Lime (BS + QS)

Jul 5th, 2021
700
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.20 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using lli = long long;
  5. struct Data{ lli st, ed;};
  6. vector < Data > range;
  7. vector < lli > qs;
  8. const int M = 7e5 + 10;
  9. const lli INF = 1e18;
  10. lli del[M];
  11. lli m, Q, n;
  12.  
  13. lli Query(lli x){
  14.     lli l = 0, r = n - 1, mn = n;
  15.     while(l <= r){
  16.         lli mid = (l + r)/ 2;
  17.         if(qs[mid] < x) l = mid + 1;
  18.         else r = mid - 1, mn = min(mn, mid);
  19.     }
  20.     lli prev = (mn == 0 ? 0: qs[mn-1]);
  21.     return range[mn].st + x - prev - 1;
  22. }
  23.  
  24. int main(){
  25.  
  26.     scanf("%lld%lld", &m, &Q);
  27.  
  28.     for(lli i=1;i<=m;i++)
  29.         scanf("%lld", &del[i]);
  30.  
  31.     sort(del + 1, del + m + 1);
  32.  
  33.     lli prev = 1, sum = 0;
  34.     for(lli i=1;i<=m;i++){
  35.         if(prev == del[i]) prev ++;
  36.         else{
  37.             range.push_back({prev, del[i] - 1});
  38.             sum += del[i] - prev;
  39.             qs.push_back(sum);
  40.             prev = del[i] + 1;
  41.         }
  42.     }
  43.     if(prev <= INF) {
  44.         range.push_back({prev, INF});
  45.         sum += INF - prev + 1;
  46.         qs.push_back(sum);
  47.     }
  48.  
  49.  
  50.     n = (lli) range.size();
  51.  
  52.     for(lli q=1;q<=Q;q++){
  53.         lli x;
  54.         scanf("%lld", &x);
  55.         printf("%lld ", Query(x));
  56.     }
  57.  
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement