Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. //#include <ext/pb_ds/assoc_container.hpp>
  4. //#include <ext/pb_ds/tree_policy.hpp>
  5.  
  6. #define fi first
  7. #define f first
  8. #define se second
  9. #define s second
  10. #define vi_a vector<int>a;
  11. #define p_b push_back
  12. #define ll long long
  13. #define ull unsigned long long
  14. #define ld long double
  15. #define pll pair<long long,long long>
  16. #define pii pair<int,int>
  17. #define m_p make_pair
  18. #define fast_io cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(0);
  19. #define all(x) x.begin(),x.end()
  20. #define sqr(x) (x)*(x)
  21. #define pw(x) (1ll << x)
  22. #define sz(x) (int)x.size()
  23. #define endl "\n"
  24. #define len(a) a.length()
  25. #define rep(i,n) for(ll i=0;i<n;i++)
  26. using namespace std;
  27. //using namespace __gnu_pbds;
  28. const ll N = 300100;
  29. const ll M = 1000100;
  30. const long long oo =LLONG_MAX;
  31. const ll PW = 20;
  32. const ll md = int(1e9) + 7;
  33. vector<ll>tree(1000000);
  34. vector<ll>mod(1000000);
  35. void push(ll v,ll tl,ll tr){
  36.     if(2*v+1<tree.size() && mod[v]){
  37.         mod[2*v]=mod[2*v+1]=mod[v];
  38.         mod[v]=0;
  39.         tree[2*v]+=mod[2*v];
  40.         tree[2*v+1]+=mod[2*v+1];
  41.     }
  42. }
  43. ll get_ans(ll l,ll r,ll v,ll tl,ll tr){
  44.     if(tl>=l && tr<=r){
  45.         return tree[v];
  46.     }
  47.     if(tl>r || tr<l){
  48.         return LLONG_MAX;
  49.     }
  50.     push(v,tl,tr);
  51.     ll tm=(tl+tr)/2;
  52.     return min(get_ans(l,r,2*v,tl,tm),get_ans(l,r,2*v+1,tm+1,tr));
  53. }
  54. void update(ll l,ll r,ll val,ll v,ll tl,ll tr){
  55.     if(tl>=l && tr<=r){
  56.         mod[v]=val;
  57.         tree[v]+=val;
  58.         return;
  59.     }
  60.     if(tl>r || tr<l){
  61.         return;
  62.     }
  63.     push(v,tl,tr);
  64.     ll tm=(tl+tr)/2;
  65.     update(l,r,val,2*v,tl,tm);
  66.     update(l,r,val,2*v+1,tm+1,tr);
  67.     tree[v]=max(tree[2*v],tree[2*v+1]);
  68. }
  69. signed main(){
  70.  
  71.     fast_io;
  72.     ll n,m,k;
  73.     cin>>n>>m>>k;
  74.     vector<pll>a(n);
  75.     for(ll i=0;i<n;i++){
  76.         cin>>a[i].f;
  77.         a[i].s=i;
  78.     }
  79.     vector<ll>zapr(k);
  80.     for(ll i=0;i<k;i++){
  81.         cin>>zapr[i];
  82.     }
  83.     sort(all(a));
  84. //    for(auto z : a){
  85. //        cout<<z.f<<" "<<z.s<<endl;
  86. //    }
  87.     vector<ll>mid(k),l(k,1),r(k,a.back().f);
  88.     bool ok=1;
  89.     while(ok){
  90.         tree.assign(4*(n-m),0);
  91.         mod.assign(4*(n-m),0);
  92.         ok=0;
  93.         set<pll>st;
  94.         for(ll i=0;i<k;i++){
  95.             if(l[i]!=r[i]){
  96.                 mid[i]=(l[i]+r[i])/2;
  97.                 cout<<mid[i]<<" ";
  98.                 st.insert(m_p(mid[i],i+1));
  99.                 ok=1;
  100.             }
  101.         }
  102.         if(!ok){
  103.             break;
  104.         }
  105.         auto it=st.begin();
  106.         for(ll i=0;i<n;i++){
  107.             update(a[i].s,a[i].s+m-1,1,1,0,n-m);
  108.             while(it!=st.end() && (*it).f<=a[i].f){
  109.                 ll lulw=get_ans(0,n-m,1,0,n-m);
  110.                 if(lulw<(*it).s){
  111.                     l[(*it).s-1]=mid[(*it).s-1]+1;
  112.                 }
  113.                 else{
  114.                     r[(*it).s-1]=mid[(*it).s-1];
  115.                 }
  116.                 it++;
  117.             }
  118.         }
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement