Pagini recente » Cod sursa (job #2944069) | Cod sursa (job #3286948) | Cod sursa (job #837036) | Cod sursa (job #604628) | Cod sursa (job #2628566)
#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::vector <std::pair <unsigned int, int>> v;
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]);
v.push_back ({x[i], i});
}
std::sort (v.begin(), v.end());
int last = v[0].first;
x[v[0].second] = 1;
for (i=1; i<n; i++){
if (v[i].first == last)
x[v[i].second] = x[v[i-1].second];
else{
x[v[i].second] = x[v[i-1].second] + 1;
last = v[i].first;
}
}
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;
}