Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- //#include <ext/pb_ds/assoc_container.hpp>
- //#include <ext/pb_ds/tree_policy.hpp>
- #define fi first
- #define f first
- #define se second
- #define s second
- #define vi_a vector<int>a;
- #define p_b push_back
- #define ll long long
- #define ull unsigned long long
- #define ld long double
- #define pll pair<long long,long long>
- #define pii pair<int,int>
- #define m_p make_pair
- #define fast_io cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(0);
- #define all(x) x.begin(),x.end()
- #define sqr(x) (x)*(x)
- #define pw(x) (1ll << x)
- #define sz(x) (int)x.size()
- #define endl "\n"
- #define len(a) a.length()
- #define rep(i,n) for(ll i=0;i<n;i++)
- using namespace std;
- //using namespace __gnu_pbds;
- const ll N = 300100;
- const ll M = 1000100;
- const long long oo =LLONG_MAX;
- const ll PW = 20;
- const ll md = int(1e9) + 7;
- vector<ll>tree(1000000);
- vector<ll>mod(1000000);
- void push(ll v,ll tl,ll tr){
- if(2*v+1<tree.size() && mod[v]){
- mod[2*v]=mod[2*v+1]=mod[v];
- mod[v]=0;
- tree[2*v]+=mod[2*v];
- tree[2*v+1]+=mod[2*v+1];
- }
- }
- ll get_ans(ll l,ll r,ll v,ll tl,ll tr){
- if(tl>=l && tr<=r){
- return tree[v];
- }
- if(tl>r || tr<l){
- return LLONG_MAX;
- }
- push(v,tl,tr);
- ll tm=(tl+tr)/2;
- return min(get_ans(l,r,2*v,tl,tm),get_ans(l,r,2*v+1,tm+1,tr));
- }
- void update(ll l,ll r,ll val,ll v,ll tl,ll tr){
- if(tl>=l && tr<=r){
- mod[v]=val;
- tree[v]+=val;
- return;
- }
- if(tl>r || tr<l){
- return;
- }
- push(v,tl,tr);
- ll tm=(tl+tr)/2;
- update(l,r,val,2*v,tl,tm);
- update(l,r,val,2*v+1,tm+1,tr);
- tree[v]=max(tree[2*v],tree[2*v+1]);
- }
- signed main(){
- fast_io;
- ll n,m,k;
- cin>>n>>m>>k;
- vector<pll>a(n);
- for(ll i=0;i<n;i++){
- cin>>a[i].f;
- a[i].s=i;
- }
- vector<ll>zapr(k);
- for(ll i=0;i<k;i++){
- cin>>zapr[i];
- }
- sort(all(a));
- // for(auto z : a){
- // cout<<z.f<<" "<<z.s<<endl;
- // }
- vector<ll>mid(k),l(k,1),r(k,a.back().f);
- bool ok=1;
- while(ok){
- tree.assign(4*(n-m),0);
- mod.assign(4*(n-m),0);
- ok=0;
- set<pll>st;
- for(ll i=0;i<k;i++){
- if(l[i]!=r[i]){
- mid[i]=(l[i]+r[i])/2;
- cout<<mid[i]<<" ";
- st.insert(m_p(mid[i],i+1));
- ok=1;
- }
- }
- if(!ok){
- break;
- }
- auto it=st.begin();
- for(ll i=0;i<n;i++){
- update(a[i].s,a[i].s+m-1,1,1,0,n-m);
- while(it!=st.end() && (*it).f<=a[i].f){
- ll lulw=get_ans(0,n-m,1,0,n-m);
- if(lulw<(*it).s){
- l[(*it).s-1]=mid[(*it).s-1]+1;
- }
- else{
- r[(*it).s-1]=mid[(*it).s-1];
- }
- it++;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement