Pagini recente » Cod sursa (job #3158694) | Cod sursa (job #220317) | Cod sursa (job #1019778) | Cod sursa (job #240273) | Cod sursa (job #59475)
Cod sursa(job #59475)
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
#define NMAX 1 << 20
#define Q 69997
void read();
void solve();
bool lcmp(const int &a, const int &b);
int N, L, U, V[NMAX], A[NMAX], sol[NMAX], nr, X;
vector<int> H[Q];
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
read();
solve();
return 0;
}
void read()
{
scanf("%d%d%d", &N, &L, &U);
for(int i = 0; i < N; i++)
{
scanf("%d", V + i);
H[V[i] % Q].push_back(i);
}
}
void solve()
{
int u = -1, i, j;
for(i = 0; i < Q; i++)
{
if(H[i].size())
sort(H[i].begin(), H[i].end(), lcmp);
for(j = 0; j < H[i].size(); j++)
{
if(!j || V[H[i][j - 1]] != V[H[i][j]])
u++;
A[H[i][j]] = u;
}
}
memset(V, 0, sizeof(V));
long long rez = 0;
X = U;
rez++, V[A[0]]++, nr++;
for(i = 1, j = 0; i < N; i++)
{
nr = V[A[i]] == 0 ? nr + 1 : nr;
V[A[i]]++;
if(nr > X)
{
for(; j <= i && nr > X; j++)
{
nr = V[j] == 1 ? nr - 1: nr;
V[j]--;
}
}
rez += i - j + 1;
}
for(; j < N; j++)
V[A[j]]--;
nr = 0;
X = L - 1;
if(!X);
else
{
rez--, V[A[0]]++, nr++;
for(i = 1, j = 0; i < N; i++)
{
nr = V[A[i]] == 0 ? nr + 1 : nr;
V[A[i]]++;
if(nr > X)
{
for(; j <= i && nr > X; j++)
{
nr = V[j] == 1 ? nr - 1: nr;
V[j]--;
}
}
rez -= i - j + 1;
}
}
printf("%lld\n", rez);
}
bool lcmp(const int &a, const int &b)
{
return V[a] - V[b] < 0 ? true : false;
}