Advertisement
Guest User

joisc-road

a guest
Mar 22nd, 2021
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.32 KB | None | 0 0
  1. /*
  2.     Normie's Template v2.1
  3.     Changes:
  4.     Added vectorization optimizations.
  5. */
  6.  
  7. // Standard library in one include.
  8. #include <bits/stdc++.h>
  9. using namespace std;
  10.  
  11. // ordered_set library.
  12. #include <ext/pb_ds/assoc_container.hpp>
  13. #include <ext/pb_ds/tree_policy.hpp>
  14. using namespace __gnu_pbds;
  15. #define ordered_set(el) tree<el,null_type,less<el>,rb_tree_tag,tree_order_statistics_node_update>
  16.  
  17. // AtCoder library. (Comment out these two lines if you're not submitting in AtCoder.) (Or if you want to use it in other judges, run expander.py first.)
  18. //#include <atcoder/all>
  19. //using namespace atcoder;
  20.  
  21. //File I/O.
  22. #define FILE_IN "cseq.inp"
  23. #define FILE_OUT "cseq.out"
  24. #define ofile freopen(FILE_IN,"r",stdin);freopen(FILE_OUT,"w",stdout)
  25.  
  26. //Fast I/O.
  27. #define fio ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
  28. #define nfio cin.tie(0);cout.tie(0)
  29. #define endl "\n"
  30.  
  31. //Order checking.
  32. #define ord(a,b,c) ((a>=b)and(b>=c))
  33.  
  34. //min/max redefines, so i dont have to resolve annoying compile errors.
  35. #define min(a,b) (((a)<(b))?(a):(b))
  36. #define max(a,b) (((a)>(b))?(a):(b))
  37.  
  38. // Fast min/max assigns to use with AVX.
  39. // Requires g++ 9.2.0.
  40. template<typename T>
  41. __attribute__((always_inline)) void chkmin(T& a, const T& b) {
  42.     a=(a<b)?a:b;
  43. }
  44.  
  45. template<typename T>
  46. __attribute__((always_inline)) void chkmax(T& a, const T& b) {
  47.     a=(a>b)?a:b;
  48. }
  49.  
  50. //Constants.
  51. #define MOD (ll(998244353))
  52. #define MAX 300001
  53. #define mag 320
  54. const long double PI=3.14159265358979;
  55.  
  56. //Pairs and 3-pairs.
  57. #define p1 first
  58. #define p2 second.first
  59. #define p3 second.second
  60. #define fi first
  61. #define se second
  62. #define pii(element_type) pair<element_type,element_type>
  63. #define piii(element_type) pair<element_type,pii(element_type)>
  64.  
  65. //Quick power of 2.
  66. #define pow2(x) (ll(1)<<x)
  67.  
  68. //Short for-loops.
  69. #define ff(i,__,___) for(int i=__;i<=___;i++)
  70. #define rr(i,__,___) for(int i=__;i>=___;i--)
  71.  
  72. //Typedefs.
  73. #define bi BigInt
  74. typedef long long ll;
  75. typedef long double ld;
  76. typedef short sh;
  77.  
  78. //---------END-------//
  79. struct FenwickTree {
  80.     int bit[260001];  // binary indexed tree
  81.     int n;
  82.  
  83.     FenwickTree(int n) {
  84.         this->n = n;
  85.         for (int i=0;i<n;i++) bit[i]=0;
  86.     }
  87.  
  88.     FenwickTree(vector<int> a) : FenwickTree(a.size()) {
  89.         for (size_t i = 0; i < a.size(); i++)
  90.             add(i, a[i]);
  91.     }
  92.  
  93.     int sum(int r) {
  94.         int ret = 0;
  95.         for (; r >= 0; r = (r & (r + 1)) - 1)
  96.             ret += bit[r];
  97.         return ret;
  98.     }
  99.  
  100.     int sum(int l, int r) {
  101.         l++;
  102.         r++;
  103.         return sum(r) - sum(l - 1);
  104.     }
  105.  
  106.     void add(int idx, int delta) {
  107.         idx++;
  108.         for (; idx < n; idx = idx | (idx + 1))
  109.             bit[idx] += delta;
  110.     }
  111. };
  112. FenwickTree fen(260000);
  113.  
  114.  
  115.  
  116.  
  117.  
  118. vector<ll> vec;
  119. ll n,m,i,j,k,t,t1,u,v,a,b;
  120. ll x[250001],y[250001];
  121. vector<ll> liss,lism;
  122. ll cur[250001];
  123. vector<int> ev[250001][3];
  124. vector<ll> res;
  125.  
  126. vector<int> sorts,sortm;
  127. int ls[250001],rs[250001],lm[250001],rm[250001];
  128. int cs[250001],cm[250001];
  129.  
  130.  
  131. struct segv
  132. {
  133.     vector<pii(int)> cnt[1000001];
  134.     vector<pii(int)> res;
  135.     void reset(int c, int l, int r)
  136.     {
  137.         cnt[c].clear();
  138.         if (l<r)
  139.         {
  140.             int mid=(l+r)/2;
  141.             reset((c<<1),l,mid);
  142.             reset((c<<1)+1,mid+1,r);
  143.         }
  144.     }
  145.     void add(int c, int l, int r, int x, int y)
  146.     {
  147.         if ((l<=x)and(x<=r))
  148.         {
  149.             cnt[c].push_back({liss[y],lism[x]});
  150.             if (l<r)
  151.             {
  152.             int mid=(l+r)/2;
  153.             add((c<<1),l,mid,x,y);
  154.             add((c<<1)+1,mid+1,r,x,y);
  155.             }
  156.         }
  157.     }
  158.     void get(int c, int l, int r, int tl, int tr, ll y)
  159.     {
  160.         if ((l>tr)or(r<tl)) return;
  161.         if ((l>=tl)and(r<=tr))
  162.         {
  163.             for (int i=cnt[c].size()-1;i>=0;i--) if (cnt[c][i].fi>=y) res.push_back(cnt[c][i]);
  164.             else break;
  165.         }
  166.         else
  167.         {
  168.             int mid=(l+r)/2;
  169.             get((c<<1),l,mid,tl,tr,y);
  170.             get((c<<1)+1,mid+1,r,tl,tr,y);
  171.         }
  172.     }
  173. };
  174. segv stv;
  175.  
  176.  
  177.  
  178.  
  179. ll check(ll val)
  180. {
  181.     for (i=0;i<liss.size();i++) ev[i][0].clear();
  182.     for (i=0;i<liss.size();i++) ev[i][1].clear();
  183.     for (i=0;i<liss.size();i++) ev[i][2].clear();
  184.     for (i=0;i<260000;i++) fen.bit[i]=0;
  185.    
  186.    
  187.     a=0;
  188.     b=0;
  189.     for (i=1;i<=n;i++)
  190.     {
  191.         v=sorts[i-1];
  192.         while (liss[a]<x[v]+y[v]-val) a++;
  193.         while ((b<liss.size()-1)and(liss[b+1]<=x[v]+y[v]+val)) b++;
  194.         ls[v]=a;
  195.         rs[v]=b;
  196.     }
  197.    
  198.    
  199.     a=0;
  200.     b=0;
  201.     for (i=1;i<=n;i++)
  202.     {
  203.         v=sortm[i-1];
  204.         while (lism[a]<x[v]-y[v]-val) a++;
  205.         while ((b<lism.size()-1)and(lism[b+1]<=x[v]-y[v]+val)) b++;
  206.         lm[v]=a;
  207.         rm[v]=b;
  208.     }
  209.    
  210.     for (i=1;i<=n;i++)
  211.     {
  212.         ev[cs[i]][1].push_back(i);
  213.         ev[ls[i]][0].push_back(i);
  214.         ev[rs[i]][2].push_back(i);
  215.         cur[i]=0;
  216.     }
  217.    
  218.     for (i=0;i<liss.size();i++)
  219.     {
  220.     //  cout<<g.p1<<' '<<g.p2<<' '<<g.p3<<endl;
  221.         for (auto g : ev[i][0])
  222.         {
  223.             u=lm[g];
  224.             v=rm[g];
  225.     //      cout<<"ask "<<u<<' '<<v<<endl;
  226.             a=fen.sum(u,v);
  227.     //      cout<<a<<endl;
  228.             cur[g]-=a;
  229.         }
  230.         for (auto g : ev[i][1])
  231.         {
  232.             u=cm[g];
  233.             fen.add(u,1);
  234.         }
  235.         for (auto g : ev[i][2])
  236.         {
  237.             u=lm[g];
  238.             v=rm[g];
  239.         //  cout<<"ask "<<u<<' '<<v<<endl;
  240.             a=fen.sum(u,v);
  241.         //  cout<<a<<endl;
  242.             cur[g]+=a;
  243.         }
  244.     }
  245.    
  246.     u=0;
  247.     for (i=1;i<=n;i++) u+=(cur[i]-1);
  248.     u/=2;
  249. //  cout<<"check "<<val<<' '<<u<<endl;
  250.     return (u<m);
  251. }
  252. int main()
  253. {
  254. //  freopen("test.txt","r",stdin);
  255. //  freopen("testans.txt","w",stdout);
  256.     fio;
  257.     cin>>n>>m;
  258.     for (i=1;i<=n;i++)
  259.     {
  260.         cin>>x[i]>>y[i];
  261.         liss.push_back(x[i]+y[i]);
  262.         lism.push_back(x[i]-y[i]);
  263.         sorts.push_back(i);
  264.         sortm.push_back(i);
  265.     }
  266.    
  267.    
  268.    
  269.    
  270.     sort(liss.begin(),liss.end());
  271.     auto its=unique(liss.begin(),liss.end());
  272.     liss.erase(its,liss.end());
  273.     sort(lism.begin(),lism.end());
  274.     auto itm=unique(lism.begin(),lism.end());
  275.     lism.erase(itm,lism.end());
  276.    
  277.    
  278.     for (i=1;i<=n;i++) cs[i]=lower_bound(liss.begin(),liss.end(),x[i]+y[i])-liss.begin();
  279.     for (i=1;i<=n;i++) cm[i]=lower_bound(lism.begin(),lism.end(),x[i]-y[i])-lism.begin();
  280.    
  281.     sort(sorts.begin(),sorts.end(),[](int a, int b){
  282.         return (cs[a]<cs[b]);
  283.     });
  284.    
  285.     sort(sortm.begin(),sortm.end(),[](int a, int b){
  286.         return (cm[a]<cm[b]);
  287.     });
  288.    
  289.    
  290.    
  291. //  for (auto g : liss) cout<<g<<' '; cout<<endl;
  292. //  for (auto g : lism) cout<<g<<' '; cout<<endl;
  293.     ll l=0,r=4e9+1,mid=0;
  294.     while(l<r)
  295.     {
  296.         mid=(l+r)/2;
  297.        
  298. //      cerr<<l<<' '<<r<<' '<<mid<<endl;
  299.         if (check(mid+1)) l=mid+1;
  300.         else r=mid;
  301.     }
  302.    
  303.    
  304.    
  305.    
  306.    
  307.     stv.reset(1,0,lism.size()-1);
  308.    
  309.    
  310.     for (i=0;i<liss.size();i++) ev[i][0].clear();
  311.     for (i=0;i<liss.size();i++) ev[i][1].clear();
  312.     for (i=0;i<liss.size();i++) ev[i][2].clear();
  313.    
  314.     for (i=1;i<=n;i++)
  315.     {
  316.        
  317.         u=lower_bound(liss.begin(),liss.end(),x[i]+y[i])-liss.begin();
  318.         ev[u][1].push_back(i);
  319.         u=upper_bound(liss.begin(),liss.end(),x[i]+y[i]+l)-liss.begin()-1;
  320.         ev[u][2].push_back(i);
  321.     }
  322.    
  323.     for (i=0;i<liss.size();i++)
  324.     {
  325.         for (auto g : ev[i][1])
  326.         {
  327.             u=lower_bound(lism.begin(),lism.end(),x[g]-y[g])-lism.begin();
  328.             stv.add(1,0,lism.size()-1,u,i);
  329.         }
  330.         for (auto g : ev[i][2])
  331.         {
  332.             u=lower_bound(lism.begin(),lism.end(),x[g]-y[g]-l)-lism.begin();
  333.             v=upper_bound(lism.begin(),lism.end(),x[g]-y[g]+l)-lism.begin()-1;
  334.             stv.res.clear();
  335.             stv.get(1,0,lism.size()-1,u,v,x[g]+y[g]-l);
  336.             for (auto gg : stv.res) res.push_back(max(abs((ll)gg.fi-x[g]-y[g]),abs((ll)gg.se-x[g]+y[g])));
  337.         }
  338.     }
  339.     sort(res.begin(),res.end());
  340.     vector<ll> res2;
  341.     for (auto g :res) if (g) res2.push_back(g);
  342.     res.clear();
  343.     for (i=0;i<res2.size();i+=2) res.push_back(res2[i]);
  344.     while(res.size()<m) res.push_back(l+1);
  345.     for (auto g :res) cout<<g<<endl;
  346.    
  347. }
  348.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement