Pagini recente » Cod sursa (job #180368) | Cod sursa (job #1483699) | Cod sursa (job #353081) | Cod sursa (job #216101) | Cod sursa (job #2628550)
#include <bits/stdc++.h>
#define maxn (1<<20)+5
#define MAXIM 1000000
std::ofstream fout ("secv5.out");
char buff[MAXIM+2];
int poz=MAXIM-1;
inline void cit(unsigned &nr){
while(buff[poz]<'0' || buff[poz]>'9'){//nu e cifra
poz++;
if(poz==MAXIM){
fread(buff,1,MAXIM,stdin);
poz=0;
}
}
nr=0;
while(buff[poz]>='0' && buff[poz]<='9'){
nr=nr*10+buff[poz]-'0';
poz++;
if(poz==MAXIM){
fread(buff,1,MAXIM,stdin);
poz=0;
}
}
}
unsigned int x[maxn];
int posMin[maxn], posMax[maxn];
int freq[maxn];
std::map <unsigned int, int> mp;
int main()
{
freopen ("secv5.in","r",stdin);
unsigned int aux;
int n, min, max, i, j, k=1, diff=0;
cit(aux); n = aux;
cit(aux); min = aux;
cit(aux); max = aux;
for (i=0; i<n; i++){
cit(x[i]);
if (mp[x[i]] == 0){
mp[x[i]] = k;
x[i] = k++;
}
else
x[i] = mp[x[i]];
}
for (i=0, j=-1, diff=0; i<n; i++){
while (diff < min and j < n-1){
j ++;
if (freq[x[j]] == 0)
diff ++;
freq[x[j]] ++;
}
if (diff == min)
posMin[i] = j;
else
posMin[i] = -1;
if (freq[x[i]] == 1)
diff--;
freq[x[i]] --;
}
for (i=0, j=-1, diff=0; i<n; i++){
while (diff < max and j < n-1){
j ++;
if (freq[x[j]] == 0)
diff ++;
freq[x[j]] ++;
}
while (j < n-1 and freq[x[j+1]] != 0){
j++;
freq[x[j]] ++;
}
if (diff <= max)
posMax[i] = j;
else
posMax[i] = -1;
if (freq[x[i]] == 1)
diff--;
freq[x[i]] --;
}
long long ans = 0;
for (i=0; i<n; i++){
if (posMin[i] != -1 and posMin[i] <= posMax[i])
ans += posMax[i] - posMin[i] + 1;
}
/*
for (i=0; i<n; i++)
fout << posMin[i] << ' ';
fout << '\n';
for (i=0; i<n; i++)
fout << posMax[i] << ' ';
*/
fout << ans << '\n';
return 0;
}