#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sz(a) int(a.size())
#define pb push_back

int gi() {
	int x=0,o=1;char ch=getchar();
	while(!isdigit(ch)&&ch!='-') ch=getchar();
	if(ch=='-') o=-1,ch=getchar();
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	return x*o;
}

struct dat {
	int p,v,l,r;
};

int n,l;
ll ans=0;

struct cmp1 {
	bool operator()(const dat &A,const dat &B) {
		return A.p<B.p;
	}
};

struct cmp2 {
	bool operator()(const dat &A,const dat &B) {
		return make_pair(A.v,A.p)<make_pair(B.v,B.p);
	}
};

set<dat,cmp1> s1;
set<dat,cmp2> s2;

ll cal(const vector<dat> &v) {
	ll ret=0,sum=0;
	for(int i=0;i+l-1<sz(v);i++) sum+=v[i].l,ret+=sum*v[i+l-1].r;
	return ret;
}

int main() {
	cin>>n>>l;
	for(int i=1;i<=n;i++) {
		dat a=(dat){i,gi(),1,1};
		s1.insert(a);s2.insert(a);
	}
	while(!s2.empty()) {
		int mn=s2.begin()->v;
		vector<dat> vec;
		while(!s2.empty()&&s2.begin()->v==mn) vec.pb(*s2.begin()),s2.erase(s2.begin());
		for(int i=0,j;i<sz(vec);i=j) {
			j=i+1;
			while(j<sz(vec)&&++s1.find(vec[j-1])==s1.find(vec[j])) ++j;
			vector<dat> tmp(vec.begin()+i,vec.begin()+j);
			int len=j-i,cnt=len/l;
			if(cnt) {
				for(auto x:tmp) s1.erase(x);
				ans+=cal(tmp);
				vector<dat> now;
				for(int k=0;k<cnt;k++) now.pb((dat){tmp[0].p+k,mn+1,0,0});
				for(int k=0;k<sz(tmp)-l+1;k++) now[cnt-(sz(tmp)-k)/l].l+=tmp[k].l;
				for(int k=l-1;k<sz(tmp);k++) now[(k+1)/l-1].r+=tmp[k].r;
				ans-=cal(now);
				for(auto x:now) s1.insert(x),s2.insert(x);
			}
		}
	}
	cout<<ans+n;
	return 0;
}
