This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define f first
#define s second
#define fore(i,a,b) for(int i = (a), ThxMK = (b); i < ThxMK; ++i)
#define pb push_back
#define all(s) begin(s), end(s)
#define _ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define sz(s) int(s.size())
#define ENDL '\n'
#define vv(type, name, h, ...) vector<vector<type>> name(h, vector<type>(__VA_ARGS__))
#define vvv(type, name, h, w, ...) vector<vector<vector<type>>> name(h, vector<vector<type>>(w, vector<type>(__VA_ARGS__)))
using namespace std;
long long gcd(long long a, long long b){ return b? gcd(b, a%b) : a; }
long long lcm(long long a, long long b){ return (!a or !b)? 0 : a * b / gcd(a,b); } 
long long  poww(long long  a, long long b){
	long long res = 1;
	while(b){ 
		if(b%2) res = res * a ; 
		a = a * a;  b>>=1;
	} return res;
}
// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// int rnd(int n){return uniform_int_distribution<int>(0, n-1)(rng);}
template <typename T> static constexpr T inf = numeric_limits<T>::max() / 2;
template<class t,class u>bool mmax(t&a,u b){if(a<b)a=b;return a<b;}
template<class t,class u>bool mmin(t&a,u b){if(b<a)a=b;return b<a;}
template<class t> using vc=vector<t>;
template<class t> using vvc=vc<vc<t>>;
using li = long long;
using vi = vc<int>;
using ii = pair<int,int>;
//  ('-')7
struct ST{
	#define mid (l+r)/2
	#define left(u) (u+1)
	#define right(u) (u+((mid-l+1)<<1))
	vi st;
	ST(int n):st(2*n,0){}
	int f(int a, int b){
		return max(a,b);
	}
 
	void update(int u, int l, int r, int pos, int val){
		if(l>r)return;
		if(l==r){st[u]=val; return;}
		if(pos<=mid)update(left(u),l,mid,pos,val);
		else update(right(u),mid+1,r,pos,val);
		st[u]=f(st[left(u)],st[right(u)]);
	}
 
	int query(int u, int l, int r, int ll, int rr){
		if(l>r or rr<l or ll>r)return 0;
		if(l>=ll and r<=rr)return st[u];
		return f(query(left(u),l,mid,ll,rr),query(right(u),mid+1,r,ll,rr));
	}
 
};
set<int>e;
set<ii>s;
int m;
void add(int l, int r){
	if(l>r)return;
	if(r-l+1<m)return;
	s.insert({l,r});
	e.insert(r);
}
void del(int w){
	auto u = s.upper_bound({w+1,-1});
	if(u==s.begin())return;
	u--;
	auto [a,b]=*u;
	if(w>=a and w<=b){
		s.erase(u);
		e.erase(b);
		add(a,w-1);
		add(w+1,b);
	}
}
int main(){_
	auto solve=[&](){
		int n; cin>>n>>m;
		e.insert(n);
		add(0,n-1);
		vc<ii>v(n);
		fore(i,0,n){
			int a; cin>>a;
			v[i]={a,-i};
		}
		sort(all(v),greater<ii>());
		ST st(n);
		int best = 1;
		fore(i,0,n){
			int w = -v[i].s;
			del(w);
			auto x = e.upper_bound(w);
			int res = st.query(0,0,n-1,w,*x);
			best = max(res+1,best);
			st.update(0,0,n-1,w,res+1);
		}
		cout<<best<<ENDL;
		
		
	};
	//int t; cin>>t; while(t--)
	solve();
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |