/* problem statement text */
/*
CSES - Sliding Window Advertisement
Time limit: 1.00 s
Memory limit: 512 MB
A fence consists of nnn vertical boards. The width of each board is 1 and their heights may vary.
You want to attach a rectangular advertisement to the fence. Your task is to calculate the maximum area of such an advertisement in each window of kkk vertical boards, from left to right.
Input
The first line contains two integers nnn and kkk: the width of the fence and the size of the window.
After this, there are nnn integers x1,x2,…,xnx_1, x_2, \dots, x_nx1,x2,…,xn: the height of each board.
Output
Print n−k+1n - k + 1n−k+1 integers: the maximum areas of the advertisements.
Constraints
1≤k≤n≤2⋅1051 \le k \le n \le 2 \cdot 10^51≤k≤n≤2⋅105
1≤xi≤1091 \le x_i \le 10^91≤xi≤109
Example
Input:
8 3
4 1 5 3 3 2 4 1
Output:
5 6 9 6 6 4
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
void PRE( ) {
ios_base:: sync_with_stdio ( false ) ;
cin .tie ( 0 ) ;
cout .tie ( 0 ) ;
#ifndef ONLINE_JUDGE
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
// freopen("error.txt", "w", stderr);
#endif
}
struct LineTree {
struct TNode {
ll k, b;
TNode * l, * r;
TNode( ) : k( 0 ) , b( 0 ) , l( nullptr) , r( nullptr) {
}
} ;
TNode * root;
int dl;
int dr;
bool comp( ll ak, ll ab, ll bk, ll bb, ll x) { return ak * x + ab > bk * x + bb; }
void _modify( TNode * & p, ll k, ll b, int l, int r, int ml, int mr) {
if ( p == nullptr) p = new TNode( ) ;
int mid = ( l + r) / 2 ;
if ( ml <= l && r <= mr) {
if ( l == r) {
if ( comp( k, b, p- > k, p- > b, l) ) {
p- > k = k;
p- > b = b;
}
return ;
}
if ( comp( k, b, p- > k, p- > b, mid) ) {
std:: swap ( p- > k, k) ;
std:: swap ( p- > b, b) ;
}
if ( ml <= mid && comp( k, b, p- > k, p- > b, l) ) _modify( p- > l, k, b, l, mid, ml, mr) ;
if ( mid + 1 <= mr && comp( k, b, p- > k, p- > b, r) ) _modify( p- > r, k, b, mid + 1 , r, ml, mr) ;
} else {
if ( mid >= ml) _modify( p- > l, k, b, l, mid, ml, mr) ;
if ( mid < mr) _modify( p- > r, k, b, mid + 1 , r, ml, mr) ;
}
}
ll _query( TNode * & p, int pos, int l, int r) {
if ( p == nullptr) return 0 ;
if ( l == r) return p- > k * pos + p- > b;
int mid = ( l + r) / 2 ;
ll ret = p- > k * pos + p- > b;
if ( pos <= mid) ret = std:: max ( ret, _query( p- > l, pos, l, mid) ) ;
else ret = std:: max ( ret, _query( p- > r, pos, mid + 1 , r) ) ;
return ret;
}
public :
LineTree( int dl, int dr) : dl( dl) , dr( dr) , root( new TNode( ) ) {
}
void modify( ll k, ll b, int l, int r) {
// guard invalid ranges (keeps behavior safe)
if ( l > r) return ;
l = max( l, dl) ;
r = min( r, dr) ;
if ( l > r) return ;
_modify( root, k, b, dl, dr, l, r) ;
}
ll query( int pos) { return _query( root, pos, dl, dr) ; }
} ;
int main( ) {
PRE( ) ;
int n, k;
cin >> n >> k;
vector< ll> a( n) ;
for ( int i = 0 ; i < n; ++ i) cin >> a[ i] ;
map< ll, vector< int > > app;
for ( int i = 0 ; i < n; ++ i) app[ a[ i] ] .push_back ( i) ;
set< int > o;
for ( int i = - 1 ; i <= n; ++ i) o.insert ( i) ;
LineTree lt( 0 , n) ;
for ( auto it = app.rbegin ( ) ; it ! = app.rend ( ) ; ++ it) {
ll v = it- > first;
auto & pos_list = it- > second;
for ( int idx: pos_list) o.erase ( idx) ;
for ( int idx: pos_list) {
auto up = o.upper_bound ( idx) ;
int left_prev = * prev( up) ;
int right_next = * up;
int l = left_prev + 1 ;
int r = right_next - 1 ;
if ( r - k + 1 >= 0 ) {
lt.modify ( v, ( ll) ( k - l) * v, max( 0 , l - k + 1 ) , min( l, r - k + 1 ) ) ;
}
if ( r - l + 1 >= k) {
lt.modify ( 0 , ( ll) k * v, l, r - k + 1 ) ;
}
lt.modify ( - v, ( ll) ( r + 1 ) * v, max( l, r - k + 1 ) , r) ;
if ( r - k + 1 <= l) {
lt.modify ( 0 , ( ll) ( r - l + 1 ) * v, r - k + 1 , l) ;
}
}
}
for ( int i = 0 ; i + k - 1 < n; ++ i) {
cout << lt.query ( i) << ( i + k - 1 < n - 1 ? ' ' : '\n ' ) ;
}
if ( n - k + 1 <= 0 ) cout << "\n " ;
}
LyogcHJvYmxlbSBzdGF0ZW1lbnQgdGV4dCAqLwovKgpDU0VTIC0gU2xpZGluZyBXaW5kb3cgQWR2ZXJ0aXNlbWVudAoKVGltZSBsaW1pdDogMS4wMCBzCk1lbW9yeSBsaW1pdDogNTEyIE1CCgpBIGZlbmNlIGNvbnNpc3RzIG9mIG5ubiB2ZXJ0aWNhbCBib2FyZHMuIFRoZSB3aWR0aCBvZiBlYWNoIGJvYXJkIGlzIDEgYW5kIHRoZWlyIGhlaWdodHMgbWF5IHZhcnkuCllvdSB3YW50IHRvIGF0dGFjaCBhIHJlY3Rhbmd1bGFyIGFkdmVydGlzZW1lbnQgdG8gdGhlIGZlbmNlLiBZb3VyIHRhc2sgaXMgdG8gY2FsY3VsYXRlIHRoZSBtYXhpbXVtIGFyZWEgb2Ygc3VjaCBhbiBhZHZlcnRpc2VtZW50IGluIGVhY2ggd2luZG93IG9mIGtrayB2ZXJ0aWNhbCBib2FyZHMsIGZyb20gbGVmdCB0byByaWdodC4KSW5wdXQKVGhlIGZpcnN0IGxpbmUgY29udGFpbnMgdHdvIGludGVnZXJzIG5ubiBhbmQga2trOiB0aGUgd2lkdGggb2YgdGhlIGZlbmNlIGFuZCB0aGUgc2l6ZSBvZiB0aGUgd2luZG93LgpBZnRlciB0aGlzLCB0aGVyZSBhcmUgbm5uIGludGVnZXJzIHgxLHgyLOKApix4bnhfMSwgeF8yLCBcZG90cywgeF9ueDHigIsseDLigIss4oCmLHhu4oCLOiB0aGUgaGVpZ2h0IG9mIGVhY2ggYm9hcmQuCk91dHB1dApQcmludCBu4oiSaysxbiAtIGsgKyAxbuKIkmsrMSBpbnRlZ2VyczogdGhlIG1heGltdW0gYXJlYXMgb2YgdGhlIGFkdmVydGlzZW1lbnRzLgpDb25zdHJhaW50cwoKMeKJpGviiaRu4omkMuKLhTEwNTEgXGxlIGsgXGxlIG4gXGxlIDIgXGNkb3QgMTBeNTHiiaRr4omkbuKJpDLii4UxMDUKMeKJpHhp4omkMTA5MSBcbGUgeF9pIFxsZSAxMF45MeKJpHhp4oCL4omkMTA5CgpFeGFtcGxlCklucHV0Ogo4IDMKNCAxIDUgMyAzIDIgNCAxCgpPdXRwdXQ6CjUgNiA5IDYgNiA0CiovCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiBsb25nIGRvdWJsZSBsZDsKCnZvaWQgUFJFKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwogICAgY291dC50aWUoMCk7CiNpZm5kZWYgT05MSU5FX0pVREdFCi8vICAgIGZyZW9wZW4oImluLnR4dCIsICJyIiwgc3RkaW4pOwovLyAgICBmcmVvcGVuKCJvdXQudHh0IiwgInciLCBzdGRvdXQpOwovLyAgICBmcmVvcGVuKCJlcnJvci50eHQiLCAidyIsIHN0ZGVycik7CiNlbmRpZgp9CgpzdHJ1Y3QgTGluZVRyZWUgewogICAgc3RydWN0IFROb2RlIHsKICAgICAgICBsbCBrLCBiOwogICAgICAgIFROb2RlICpsLCAqcjsKCiAgICAgICAgVE5vZGUoKSA6IGsoMCksIGIoMCksIGwobnVsbHB0ciksIHIobnVsbHB0cikgewogICAgICAgIH0KICAgIH07CgogICAgVE5vZGUgKnJvb3Q7CiAgICBpbnQgZGw7CiAgICBpbnQgZHI7CgogICAgYm9vbCBjb21wKGxsIGFrLCBsbCBhYiwgbGwgYmssIGxsIGJiLCBsbCB4KSB7IHJldHVybiBhayAqIHggKyBhYiA+IGJrICogeCArIGJiOyB9CgogICAgdm9pZCBfbW9kaWZ5KFROb2RlIComcCwgbGwgaywgbGwgYiwgaW50IGwsIGludCByLCBpbnQgbWwsIGludCBtcikgewogICAgICAgIGlmIChwID09IG51bGxwdHIpIHAgPSBuZXcgVE5vZGUoKTsKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICAgICAgaWYgKG1sIDw9IGwgJiYgciA8PSBtcikgewogICAgICAgICAgICBpZiAobCA9PSByKSB7CiAgICAgICAgICAgICAgICBpZiAoY29tcChrLCBiLCBwLT5rLCBwLT5iLCBsKSkgewogICAgICAgICAgICAgICAgICAgIHAtPmsgPSBrOwogICAgICAgICAgICAgICAgICAgIHAtPmIgPSBiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb21wKGssIGIsIHAtPmssIHAtPmIsIG1pZCkpIHsKICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChwLT5rLCBrKTsKICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChwLT5iLCBiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWwgPD0gbWlkICYmIGNvbXAoaywgYiwgcC0+aywgcC0+YiwgbCkpIF9tb2RpZnkocC0+bCwgaywgYiwgbCwgbWlkLCBtbCwgbXIpOwogICAgICAgICAgICBpZiAobWlkICsgMSA8PSBtciAmJiBjb21wKGssIGIsIHAtPmssIHAtPmIsIHIpKSBfbW9kaWZ5KHAtPnIsIGssIGIsIG1pZCArIDEsIHIsIG1sLCBtcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKG1pZCA+PSBtbCkgX21vZGlmeShwLT5sLCBrLCBiLCBsLCBtaWQsIG1sLCBtcik7CiAgICAgICAgICAgIGlmIChtaWQgPCBtcikgX21vZGlmeShwLT5yLCBrLCBiLCBtaWQgKyAxLCByLCBtbCwgbXIpOwogICAgICAgIH0KICAgIH0KCiAgICBsbCBfcXVlcnkoVE5vZGUgKiZwLCBpbnQgcG9zLCBpbnQgbCwgaW50IHIpIHsKICAgICAgICBpZiAocCA9PSBudWxscHRyKSByZXR1cm4gMDsKICAgICAgICBpZiAobCA9PSByKSByZXR1cm4gcC0+ayAqIHBvcyArIHAtPmI7CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgICAgIGxsIHJldCA9IHAtPmsgKiBwb3MgKyBwLT5iOwogICAgICAgIGlmIChwb3MgPD0gbWlkKSByZXQgPSBzdGQ6Om1heChyZXQsIF9xdWVyeShwLT5sLCBwb3MsIGwsIG1pZCkpOwogICAgICAgIGVsc2UgcmV0ID0gc3RkOjptYXgocmV0LCBfcXVlcnkocC0+ciwgcG9zLCBtaWQgKyAxLCByKSk7CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KCnB1YmxpYzoKICAgIExpbmVUcmVlKGludCBkbCwgaW50IGRyKSA6IGRsKGRsKSwgZHIoZHIpLCByb290KG5ldyBUTm9kZSgpKSB7CiAgICB9CgogICAgdm9pZCBtb2RpZnkobGwgaywgbGwgYiwgaW50IGwsIGludCByKSB7CiAgICAgICAgLy8gZ3VhcmQgaW52YWxpZCByYW5nZXMgKGtlZXBzIGJlaGF2aW9yIHNhZmUpCiAgICAgICAgaWYgKGwgPiByKSByZXR1cm47CiAgICAgICAgbCA9IG1heChsLCBkbCk7CiAgICAgICAgciA9IG1pbihyLCBkcik7CiAgICAgICAgaWYgKGwgPiByKSByZXR1cm47CiAgICAgICAgX21vZGlmeShyb290LCBrLCBiLCBkbCwgZHIsIGwsIHIpOwogICAgfQoKICAgIGxsIHF1ZXJ5KGludCBwb3MpIHsgcmV0dXJuIF9xdWVyeShyb290LCBwb3MsIGRsLCBkcik7IH0KfTsKCmludCBtYWluKCkgewogICAgUFJFKCk7CgogICAgaW50IG4sIGs7CiAgICBjaW4gPj4gbiA+PiBrOwogICAgdmVjdG9yPGxsPiBhKG4pOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIGNpbiA+PiBhW2ldOwoKICAgIG1hcDxsbCwgdmVjdG9yPGludD4gPiBhcHA7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgYXBwW2FbaV1dLnB1c2hfYmFjayhpKTsKCiAgICBzZXQ8aW50PiBvOwogICAgZm9yIChpbnQgaSA9IC0xOyBpIDw9IG47ICsraSkgby5pbnNlcnQoaSk7CgogICAgTGluZVRyZWUgbHQoMCwgbik7CgogICAgZm9yIChhdXRvIGl0ID0gYXBwLnJiZWdpbigpOyBpdCAhPSBhcHAucmVuZCgpOyArK2l0KSB7CiAgICAgICAgbGwgdiA9IGl0LT5maXJzdDsKICAgICAgICBhdXRvICZwb3NfbGlzdCA9IGl0LT5zZWNvbmQ7CgogICAgICAgIGZvciAoaW50IGlkeDogcG9zX2xpc3QpIG8uZXJhc2UoaWR4KTsKCiAgICAgICAgZm9yIChpbnQgaWR4OiBwb3NfbGlzdCkgewogICAgICAgICAgICBhdXRvIHVwID0gby51cHBlcl9ib3VuZChpZHgpOwogICAgICAgICAgICBpbnQgbGVmdF9wcmV2ID0gKnByZXYodXApOwogICAgICAgICAgICBpbnQgcmlnaHRfbmV4dCA9ICp1cDsKICAgICAgICAgICAgaW50IGwgPSBsZWZ0X3ByZXYgKyAxOwogICAgICAgICAgICBpbnQgciA9IHJpZ2h0X25leHQgLSAxOwoKICAgICAgICAgICAgaWYgKHIgLSBrICsgMSA+PSAwKSB7CiAgICAgICAgICAgICAgICBsdC5tb2RpZnkodiwgKGxsKSAoayAtIGwpICogdiwgbWF4KDAsIGwgLSBrICsgMSksIG1pbihsLCByIC0gayArIDEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAociAtIGwgKyAxID49IGspIHsKICAgICAgICAgICAgICAgIGx0Lm1vZGlmeSgwLCAobGwpIGsgKiB2LCBsLCByIC0gayArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGx0Lm1vZGlmeSgtdiwgKGxsKSAociArIDEpICogdiwgbWF4KGwsIHIgLSBrICsgMSksIHIpOwogICAgICAgICAgICBpZiAociAtIGsgKyAxIDw9IGwpIHsKICAgICAgICAgICAgICAgIGx0Lm1vZGlmeSgwLCAobGwpIChyIC0gbCArIDEpICogdiwgciAtIGsgKyAxLCBsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKGludCBpID0gMDsgaSArIGsgLSAxIDwgbjsgKytpKSB7CiAgICAgICAgY291dCA8PCBsdC5xdWVyeShpKSA8PCAoaSArIGsgLSAxIDwgbiAtIDEgPyAnICcgOiAnXG4nKTsKICAgIH0KICAgIGlmIChuIC0gayArIDEgPD0gMCkgY291dCA8PCAiXG4iOwp9Cg==