Pagini recente » Cod sursa (job #2580010) | Cod sursa (job #1240103) | Cod sursa (job #2558280) | Cod sursa (job #905929) | Cod sursa (job #58213)
Cod sursa(job #58213)
#include <stdio.h>
#include <vector>
#include <ext/hash_map>
#define MaxN ((1<<20)+100)
#define Dim 10000
#define cit(x) x=0; while (lin[poz]<'0') {poz++; if (poz==Dim) fread(lin, 1, Dim, stdin), poz=0;} \
while (lin[poz]>='0'){x=10*x+lin[poz++]-'0'; \
if (poz==Dim) fread(lin, 1, Dim, stdin), poz=0; }
using namespace std;
using namespace __gnu_cxx;
int n, p, u, nr=1, poz=0;
int a[MaxN];
int nr1[MaxN], nr2[MaxN];
hash_map<unsigned, int> h(1234567);
char lin[Dim];
int baga(unsigned x)
{
int rez;
if (rez=h[x]) return rez; else h[x]=nr++;
return nr;
}
void smart()
{
int i;
long long sol=0;
int l1=0, l2=0, dif1=1, dif2=1;
nr1[a[0]]++; nr2[a[0]]++;
for (i=0; i<n; i++){
if (i){
nr1[a[i-1]]--;
if (nr1[a[i-1]]==0) dif1--;
}
while (dif1<p && l1<n-1){
l1++;
if (nr1[a[l1]]==0) dif1++;
nr1[a[l1]]++;
}
if (i){
nr2[a[i-1]]--;
if (nr2[a[i-1]]==0) dif2--;
}
while (dif2<u && l2<n-1){
l2++;
if (nr2[a[l2]]==0) dif2++;
nr2[a[l2]]++;
}
while (l2<n-1 && nr2[a[l2+1]]>0){
l2++;
nr2[a[l2]]++;
}
if (dif1>=p) sol+=l2-l1+1;
}
printf("%lld\n", sol);
}
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d\n", &n, &p, &u);
fread(lin, 1, Dim, stdin);
int i;
for (i=0; i<n; i++){
unsigned x=0;
cit(x);
a[i]=baga(x);
}
smart();
return 0;
}