#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define itachi ios::sync_with_stdio(false); cin.tie(nullptr);
struct SegTree {
int n;
vector<ll> mn; // min value in node
vector<int> cnt; // count of positions attaining mn
vector<ll> lazy; // lazy add
SegTree(int _n=0) { init(_n); }
void init(int _n){
n = _n;
mn.assign(4*n+5, 0);
cnt.assign(4*n+5, 0);
lazy.assign(4*n+5, 0);
if(n>0) build(1,1,n);
}
void build(int node,int l,int r){
lazy[node]=0;
if(l==r){
mn[node]=0;
cnt[node]=1;
return;
}
int mid=(l+r)>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
pull(node);
}
void apply(int node,ll v){
mn[node]+=v;
lazy[node]+=v;
}
void push(int node){
if(lazy[node]!=0){
apply(node<<1, lazy[node]);
apply(node<<1|1, lazy[node]);
lazy[node]=0;
}
}
void pull(int node){
if(mn[node<<1] < mn[node<<1|1]){
mn[node]=mn[node<<1];
cnt[node]=cnt[node<<1];
} else if(mn[node<<1] > mn[node<<1|1]){
mn[node]=mn[node<<1|1];
cnt[node]=cnt[node<<1|1];
} else {
mn[node]=mn[node<<1];
cnt[node]=cnt[node<<1] + cnt[node<<1|1];
}
}
// add v to [L,R]
void add(int node,int l,int r,int L,int R,ll v){
if(R<l || r<L) return;
if(L<=l && r<=R){
apply(node,v);
return;
}
push(node);
int mid=(l+r)>>1;
add(node<<1,l,mid,L,R,v);
add(node<<1|1,mid+1,r,L,R,v);
pull(node);
}
void add(int L,int R,ll v){
if(L>R) return;
add(1,1,n,L,R,v);
}
// query min and count on [L,R]
pair<ll,int> query(int node,int l,int r,int L,int R){
if(R<l || r<L) return {LLONG_MAX, 0};
if(L<=l && r<=R) return {mn[node], cnt[node]};
push(node);
int mid=(l+r)>>1;
auto a = query(node<<1,l,mid,L,R);
auto b = query(node<<1|1,mid+1,r,L,R);
if(a.first==LLONG_MAX) return b;
if(b.first==LLONG_MAX) return a;
if(a.first < b.first) return a;
if(a.first > b.first) return b;
return {a.first, a.second + b.second};
}
pair<ll,int> query(int L,int R){
if(L>R) return {LLONG_MAX,0};
return query(1,1,n,L,R);
}
};
int main(){
itachi
int n, K;
if(!(cin >> n >> K)) return 0;
vector<int> a(n+1);
int maxA = 0;
for(int i=1;i<=n;i++){
cin >> a[i];
maxA = max(maxA, a[i]);
}
// dùng map từ giá trị -> vector vị trí (0-based trong vector)
unordered_map<int, vector<int>> pos;
pos.reserve(max(1024, maxA*2+10));
SegTree st(n);
ll ans = 0;
for(int r=1;r<=n;r++){
int v = a[r];
auto &pv = pos[v];
pv.push_back(r); // thêm vị trí r; bây giờ m = pv.size()
int m = (int)pv.size();
// nếu trước đó có interval không thỏa cho v (tức m-1 >= K), ta xóa nó
if(m-1 >= K){
int idx_prev = (m-1) - K; // idx_prev >= 0
int leftPrev = (idx_prev==0) ? 0 : pv[idx_prev-1];
int rightPrev = pv[idx_prev];
int Lp = leftPrev + 1;
int Rp = rightPrev;
if(Lp <= Rp) st.add(Lp, Rp, -1); // remove
}
// nếu m >= K thì tạo interval mới [p_{m-K}+1, p_{m-K+1}] và +1
if(m >= K){
int idx = m - K; // idx >= 0
int leftPos = (idx==0) ? 0 : pv[idx-1];
int rightPos = pv[idx];
int L = leftPos + 1;
int R = rightPos;
if(L <= R) st.add(L, R, +1);
}
// sau khi cập nhật, số l hợp lệ với r là số l in [1..r] có value == 0
auto res = st.query(1, r);
if(res.first == 0) ans += res.second;
// nếu res.first > 0 thì không có l thỏa, nếu res.first < 0 thì sai (với logic đúng không xảy ra)
}
cout << ans << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgaXRhY2hpIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShudWxscHRyKTsKCnN0cnVjdCBTZWdUcmVlIHsKICAgIGludCBuOwogICAgdmVjdG9yPGxsPiBtbjsgICAgLy8gbWluIHZhbHVlIGluIG5vZGUKICAgIHZlY3RvcjxpbnQ+IGNudDsgIC8vIGNvdW50IG9mIHBvc2l0aW9ucyBhdHRhaW5pbmcgbW4KICAgIHZlY3RvcjxsbD4gbGF6eTsgIC8vIGxhenkgYWRkCgogICAgU2VnVHJlZShpbnQgX249MCkgeyBpbml0KF9uKTsgfQoKICAgIHZvaWQgaW5pdChpbnQgX24pewogICAgICAgIG4gPSBfbjsKICAgICAgICBtbi5hc3NpZ24oNCpuKzUsIDApOwogICAgICAgIGNudC5hc3NpZ24oNCpuKzUsIDApOwogICAgICAgIGxhenkuYXNzaWduKDQqbis1LCAwKTsKICAgICAgICBpZihuPjApIGJ1aWxkKDEsMSxuKTsKICAgIH0KCiAgICB2b2lkIGJ1aWxkKGludCBub2RlLGludCBsLGludCByKXsKICAgICAgICBsYXp5W25vZGVdPTA7CiAgICAgICAgaWYobD09cil7CiAgICAgICAgICAgIG1uW25vZGVdPTA7CiAgICAgICAgICAgIGNudFtub2RlXT0xOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGludCBtaWQ9KGwrcik+PjE7CiAgICAgICAgYnVpbGQobm9kZTw8MSxsLG1pZCk7CiAgICAgICAgYnVpbGQobm9kZTw8MXwxLG1pZCsxLHIpOwogICAgICAgIHB1bGwobm9kZSk7CiAgICB9CgogICAgdm9pZCBhcHBseShpbnQgbm9kZSxsbCB2KXsKICAgICAgICBtbltub2RlXSs9djsKICAgICAgICBsYXp5W25vZGVdKz12OwogICAgfQoKICAgIHZvaWQgcHVzaChpbnQgbm9kZSl7CiAgICAgICAgaWYobGF6eVtub2RlXSE9MCl7CiAgICAgICAgICAgIGFwcGx5KG5vZGU8PDEsIGxhenlbbm9kZV0pOwogICAgICAgICAgICBhcHBseShub2RlPDwxfDEsIGxhenlbbm9kZV0pOwogICAgICAgICAgICBsYXp5W25vZGVdPTA7CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgcHVsbChpbnQgbm9kZSl7CiAgICAgICAgaWYobW5bbm9kZTw8MV0gPCBtbltub2RlPDwxfDFdKXsKICAgICAgICAgICAgbW5bbm9kZV09bW5bbm9kZTw8MV07CiAgICAgICAgICAgIGNudFtub2RlXT1jbnRbbm9kZTw8MV07CiAgICAgICAgfSBlbHNlIGlmKG1uW25vZGU8PDFdID4gbW5bbm9kZTw8MXwxXSl7CiAgICAgICAgICAgIG1uW25vZGVdPW1uW25vZGU8PDF8MV07CiAgICAgICAgICAgIGNudFtub2RlXT1jbnRbbm9kZTw8MXwxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtbltub2RlXT1tbltub2RlPDwxXTsKICAgICAgICAgICAgY250W25vZGVdPWNudFtub2RlPDwxXSArIGNudFtub2RlPDwxfDFdOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBhZGQgdiB0byBbTCxSXQogICAgdm9pZCBhZGQoaW50IG5vZGUsaW50IGwsaW50IHIsaW50IEwsaW50IFIsbGwgdil7CiAgICAgICAgaWYoUjxsIHx8IHI8TCkgcmV0dXJuOwogICAgICAgIGlmKEw8PWwgJiYgcjw9Uil7CiAgICAgICAgICAgIGFwcGx5KG5vZGUsdik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcHVzaChub2RlKTsKICAgICAgICBpbnQgbWlkPShsK3IpPj4xOwogICAgICAgIGFkZChub2RlPDwxLGwsbWlkLEwsUix2KTsKICAgICAgICBhZGQobm9kZTw8MXwxLG1pZCsxLHIsTCxSLHYpOwogICAgICAgIHB1bGwobm9kZSk7CiAgICB9CiAgICB2b2lkIGFkZChpbnQgTCxpbnQgUixsbCB2KXsKICAgICAgICBpZihMPlIpIHJldHVybjsKICAgICAgICBhZGQoMSwxLG4sTCxSLHYpOwogICAgfQoKICAgIC8vIHF1ZXJ5IG1pbiBhbmQgY291bnQgb24gW0wsUl0KICAgIHBhaXI8bGwsaW50PiBxdWVyeShpbnQgbm9kZSxpbnQgbCxpbnQgcixpbnQgTCxpbnQgUil7CiAgICAgICAgaWYoUjxsIHx8IHI8TCkgcmV0dXJuIHtMTE9OR19NQVgsIDB9OwogICAgICAgIGlmKEw8PWwgJiYgcjw9UikgcmV0dXJuIHttbltub2RlXSwgY250W25vZGVdfTsKICAgICAgICBwdXNoKG5vZGUpOwogICAgICAgIGludCBtaWQ9KGwrcik+PjE7CiAgICAgICAgYXV0byBhID0gcXVlcnkobm9kZTw8MSxsLG1pZCxMLFIpOwogICAgICAgIGF1dG8gYiA9IHF1ZXJ5KG5vZGU8PDF8MSxtaWQrMSxyLEwsUik7CiAgICAgICAgaWYoYS5maXJzdD09TExPTkdfTUFYKSByZXR1cm4gYjsKICAgICAgICBpZihiLmZpcnN0PT1MTE9OR19NQVgpIHJldHVybiBhOwogICAgICAgIGlmKGEuZmlyc3QgPCBiLmZpcnN0KSByZXR1cm4gYTsKICAgICAgICBpZihhLmZpcnN0ID4gYi5maXJzdCkgcmV0dXJuIGI7CiAgICAgICAgcmV0dXJuIHthLmZpcnN0LCBhLnNlY29uZCArIGIuc2Vjb25kfTsKICAgIH0KICAgIHBhaXI8bGwsaW50PiBxdWVyeShpbnQgTCxpbnQgUil7CiAgICAgICAgaWYoTD5SKSByZXR1cm4ge0xMT05HX01BWCwwfTsKICAgICAgICByZXR1cm4gcXVlcnkoMSwxLG4sTCxSKTsKICAgIH0KfTsKCmludCBtYWluKCl7CiAgICBpdGFjaGkKICAgIGludCBuLCBLOwogICAgaWYoIShjaW4gPj4gbiA+PiBLKSkgcmV0dXJuIDA7CiAgICB2ZWN0b3I8aW50PiBhKG4rMSk7CiAgICBpbnQgbWF4QSA9IDA7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKyl7CiAgICAgICAgY2luID4+IGFbaV07CiAgICAgICAgbWF4QSA9IG1heChtYXhBLCBhW2ldKTsKICAgIH0KCiAgICAvLyBkw7luZyBtYXAgdOG7qyBnacOhIHRy4buLIC0+IHZlY3RvciB24buLIHRyw60gKDAtYmFzZWQgdHJvbmcgdmVjdG9yKQogICAgdW5vcmRlcmVkX21hcDxpbnQsIHZlY3RvcjxpbnQ+PiBwb3M7CiAgICBwb3MucmVzZXJ2ZShtYXgoMTAyNCwgbWF4QSoyKzEwKSk7CgogICAgU2VnVHJlZSBzdChuKTsKICAgIGxsIGFucyA9IDA7CgogICAgZm9yKGludCByPTE7cjw9bjtyKyspewogICAgICAgIGludCB2ID0gYVtyXTsKICAgICAgICBhdXRvICZwdiA9IHBvc1t2XTsKICAgICAgICBwdi5wdXNoX2JhY2socik7IC8vIHRow6ptIHbhu4sgdHLDrSByOyBiw6J5IGdp4budIG0gPSBwdi5zaXplKCkKICAgICAgICBpbnQgbSA9IChpbnQpcHYuc2l6ZSgpOwoKICAgICAgICAvLyBu4bq/dSB0csaw4bubYyDEkcOzIGPDsyBpbnRlcnZhbCBraMO0bmcgdGjhu49hIGNobyB2ICh04bupYyBtLTEgPj0gSyksIHRhIHjDs2EgbsOzCiAgICAgICAgaWYobS0xID49IEspewogICAgICAgICAgICBpbnQgaWR4X3ByZXYgPSAobS0xKSAtIEs7IC8vIGlkeF9wcmV2ID49IDAKICAgICAgICAgICAgaW50IGxlZnRQcmV2ID0gKGlkeF9wcmV2PT0wKSA/IDAgOiBwdltpZHhfcHJldi0xXTsKICAgICAgICAgICAgaW50IHJpZ2h0UHJldiA9IHB2W2lkeF9wcmV2XTsKICAgICAgICAgICAgaW50IExwID0gbGVmdFByZXYgKyAxOwogICAgICAgICAgICBpbnQgUnAgPSByaWdodFByZXY7CiAgICAgICAgICAgIGlmKExwIDw9IFJwKSBzdC5hZGQoTHAsIFJwLCAtMSk7IC8vIHJlbW92ZQogICAgICAgIH0KCiAgICAgICAgLy8gbuG6v3UgbSA+PSBLIHRow6wgdOG6oW8gaW50ZXJ2YWwgbeG7m2kgW3Bfe20tS30rMSwgcF97bS1LKzF9XSB2w6AgKzEKICAgICAgICBpZihtID49IEspewogICAgICAgICAgICBpbnQgaWR4ID0gbSAtIEs7IC8vIGlkeCA+PSAwCiAgICAgICAgICAgIGludCBsZWZ0UG9zID0gKGlkeD09MCkgPyAwIDogcHZbaWR4LTFdOwogICAgICAgICAgICBpbnQgcmlnaHRQb3MgPSBwdltpZHhdOwogICAgICAgICAgICBpbnQgTCA9IGxlZnRQb3MgKyAxOwogICAgICAgICAgICBpbnQgUiA9IHJpZ2h0UG9zOwogICAgICAgICAgICBpZihMIDw9IFIpIHN0LmFkZChMLCBSLCArMSk7CiAgICAgICAgfQoKICAgICAgICAvLyBzYXUga2hpIGPhuq1wIG5o4bqtdCwgc+G7kSBsIGjhu6NwIGzhu4cgduG7m2kgciBsw6Agc+G7kSBsIGluIFsxLi5yXSBjw7MgdmFsdWUgPT0gMAogICAgICAgIGF1dG8gcmVzID0gc3QucXVlcnkoMSwgcik7CiAgICAgICAgaWYocmVzLmZpcnN0ID09IDApIGFucyArPSByZXMuc2Vjb25kOwogICAgICAgIC8vIG7hur91IHJlcy5maXJzdCA+IDAgdGjDrCBraMO0bmcgY8OzIGwgdGjhu49hLCBu4bq/dSByZXMuZmlyc3QgPCAwIHRow6wgc2FpICh24bubaSBsb2dpYyDEkcO6bmcga2jDtG5nIHjhuqN5IHJhKQogICAgfQoKICAgIGNvdXQgPDwgYW5zIDw8ICdcbic7CiAgICByZXR1cm4gMDsKfQo=