#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define last last_2
int num[200005],n,L;
ll ans;
namespace SGT {
	int maxv[800000];
	void build(int l,int r,int o) {
		if (l==r) maxv[o]=l;
		else {
			int m=((l+r)>>1);
			build(l,m,o*2);
			build(m+1,r,o*2+1);
			maxv[o]=((num[maxv[o*2]]>=num[maxv[o*2+1]])?maxv[o*2]:maxv[o*2+1]);
		}
	}
	int query(int l,int r,int o,int lx,int rx) {
		if (l>=lx&&r<=rx) return maxv[o];
		else {
			int m=((l+r)>>1);
			if (m>=rx) return query(l,m,o*2,lx,rx);
			if (m<lx) return query(m+1,r,o*2+1,lx,rx);
			int a=query(l,m,o*2,lx,rx),b=query(m+1,r,o*2+1,lx,rx);
			return (num[a]>=num[b])?a:b;
		}
	}
}
int nxt[200005],powd[200005];
map<int,int> last;
void pre() {
	powd[0]=1;
	for(int i=1; i<=n; i++) powd[i]=min((ll)powd[i-1]*L,n+1LL);
	for(int i=n; i>0; i--) {
		nxt[i]=((last[num[i]])?last[num[i]]:n+1);
		last[num[i]]=i;
	}
}
vector <int> suml[200005],sumr[200005];
vector <int> pos[200005],son[200005];
int size[200005],lsize[200005],rsize[200005];
int val[200005],tot;
void calc(int o,int d) {
	static int sum[200005];
	if (d>n||powd[d]>n) {
		size[o]=-1;
		suml[o].resize(1);
		sumr[o].resize(1);
		lsize[o]=rsize[o]=0;
		return;
	}
	size[o]=((size[o]>=powd[d])?size[o]/powd[d]:-1);
	if (lsize[o]) {
		for(int i=1; i<=lsize[o]; i++) sum[i]=0;
		int maxn=0;
		for(int i=powd[d]; i<=lsize[o]; i++) {
			maxn=i/powd[d];
			sum[maxn]+=suml[o][i];
		}
		lsize[o]=maxn;
		suml[o].resize(maxn+1);
		for(int i=1; i<=maxn; i++) suml[o][i]=sum[i];
	}
	if (rsize[o]) {
		for(int i=1; i<=rsize[o]; i++) sum[i]=0;
		int maxn=0;
		for(int i=powd[d]; i<=rsize[o]; i++) {
			maxn=i/powd[d];
			sum[maxn]+=sumr[o][i];
		}
		rsize[o]=maxn;
		sumr[o].resize(maxn+1);
		for(int i=1; i<=maxn; i++) sumr[o][i]=sum[i];
	}
}
int solve(int l,int r) {
	static int q[200005];
	int o=++tot;
	for(int i=SGT::query(1,n,1,l,r); i<=r; i=nxt[i])
		pos[o].push_back(i);
	val[o]=num[pos[o][0]];
	son[o].resize(pos[o].size()+1);
	if (pos[o][0]>l) son[o][0]=solve(l,pos[o][0]-1);
	for(int i=1; i<(int)pos[o].size(); i++)
		if (pos[o][i]>pos[o][i-1]+1) son[o][i]=solve(pos[o][i-1]+1,pos[o][i]-1);
	if (pos[o][pos[o].size()-1]<r) son[o][son[o].size()-1]=solve(pos[o][pos[o].size()-1]+1,r);
	for(int i=0; i<(int)son[o].size(); i++)
		if (son[o][i]) calc(son[o][i],val[o]-val[son[o][i]]);
	int rx=0,lx=0;
	for(int i=rsize[son[o][0]]; i>0; i--) q[++rx]=sumr[son[o][0]][i];
	int s=0;
	for(int i=0; i<(int)pos[o].size(); i++) {
		q[++rx]=1;
		while (lx<rx&&rx-lx>=L) s+=q[++lx];
		ans+=s;
		if (son[o][i+1]) {
			int u=son[o][i+1];
			for(int j=1; j<=lsize[u]; j++) {
				while (lx<rx&&rx-lx+j>=L) s+=q[++lx];
				ans+=(ll)s*suml[u][j];
			}
			if (size[u]==-1) lx=rx,s=0;
			for(int j=rsize[u]; j>0; j--) q[++rx]=sumr[u][j];
		}
	}
	bool v=1;
	int sz=pos[o].size();
	for(int i=0; i<(int)son[o].size(); i++)
		if (size[son[o][i]]==-1) v=0;
		else sz+=size[son[o][i]];
	size[o]=((v)?sz:-1);
	suml[o].resize(1);
	for(int i=0; i<(int)son[o].size(); i++) {
		int u=son[o][i];
		for(int j=1; j<=lsize[u]; j++) suml[o].push_back(suml[u][j]);
		if (size[u]==-1) break;
		if (i+1<(int)son[o].size()) suml[o].push_back(1);
	}
	lsize[o]=suml[o].size()-1;
	sumr[o].resize(1);
	for(int i=son[o].size()-1; i>=0; i--) {
		int u=son[o][i];
		for(int j=1; j<=rsize[u]; j++) sumr[o].push_back(sumr[u][j]);
		if (size[u]==-1) break;
		if (i) sumr[o].push_back(1);
	}
	rsize[o]=sumr[o].size()-1;
	return o;
}
int main(){
	scanf("%d%d",&n,&L);
	for(int i=1;i<=n;i++){
		scanf("%d",&num[i]);
	}
	pre();
	SGT::build(1,n,1);
	solve(1,n);
	printf("%lld\n",ans+n);
	return 0;
}


Measured memory_bytes: 45824