Pagini recente » Cod sursa (job #1458483) | Cod sursa (job #1050371) | Cod sursa (job #1159640) | Cod sursa (job #1730184) | Cod sursa (job #858311)
Cod sursa(job #858311)
#include <cstdio>
#include <fstream>
#include <algorithm>
#define MAX 1050000
using namespace std;
int N, L, U, lCnt, rCnt, ptr;
long long sol;
unsigned int aux[MAX], V[MAX];
int leftAp[MAX], rightAp[MAX];
const int maxb = 1000000;
char buf[maxb];
FILE *fin = fopen("secv5.in", "r");
inline void add(int val, int V[], int &cnt)
{
if(V[val]++ == 0) cnt++;
}
inline void rmv(int val, int V[], int &cnt)
{
if(--V[val] == 0) cnt--;
}
inline int GetInt(int Type)
{
unsigned int nr = 0;
while(buf[ptr] < '0' || '9' < buf[ptr])
if(++ ptr >= maxb) fread(buf, maxb, 1, fin), ptr = 0;
while('0' <= buf[ptr] && buf[ptr] <= '9')
{
nr = nr * 10 + (unsigned int)buf[ptr] - '0';
if(++ ptr >= maxb) fread(buf, maxb, 1, fin), ptr = 0;
}
if(Type == 1) return int(nr);
else return nr;
}
int main()
{
freopen("secv5.in", "r", stdin);
N = GetInt(1);
L = GetInt(1);
U = GetInt(1);
for(int i = 1; i <= N; i++) V[i] = GetInt(2), aux[i] = V[i];
fclose(stdin); sort(aux + 1, aux + N + 1); aux[0] = 1;
for(int i = 2; i <= N; i++) if(aux[aux[0]] != aux[i]) aux[++aux[0]] = aux[i];
for(int i = 1; i <= N; i++) V[i] = lower_bound(aux + 1, aux + aux[0] + 1, V[i]) - aux;
for(int i = 1, left = 1, right = 1; i <= N && (right <= N || rCnt >= L); i++)
{
for(; left <= N; left++)
{
add(V[left], leftAp, lCnt);
if(lCnt == L)
{
rmv(V[left], leftAp, lCnt);
break;
}
}
for(; right <= N && rCnt <= U; right++)
{
add(V[right], rightAp, rCnt);
if(rCnt > U)
{
rmv(V[right], rightAp, rCnt);
break;
}
}
sol += 1LL * (right - left);
rmv(V[i], leftAp, lCnt); rmv(V[i], rightAp, rCnt);
}
ofstream out("secv5.out"); out<<sol<<"\n"; out.close();
return 0;
}