Pagini recente » Cod sursa (job #2894303) | Cod sursa (job #2301759) | Cod sursa (job #3187147) | Cod sursa (job #792503) | Cod sursa (job #12634)
Cod sursa(job #12634)
#include <stdio.h>
#include <string.h>
#include <vector>
#define MOD 666013
#define NMax 1048580
using namespace std;
int N, L, U;
unsigned int v[NMax], h = 1;
int uz[NMax];
long long Res = 0;
vector< pair<unsigned int, int> > H[MOD];
long long check(int X)
{
int i, lst, nrd;
long long R = 0;
if (X == 0) return 0;
memset(uz, 0, sizeof(uz));
for (i = 1, lst = 1, nrd = 0; i <= N; i++)
{
if (!uz[v[i]]) nrd++;
uz[v[i]]++;
while (lst < i && nrd > X)
{
uz[v[lst]]--;
if (!uz[v[lst]]) nrd--;
lst++;
}
R += (i-lst+1);
}
return R;
}
int cheie(unsigned int X)
{
int r = X % MOD;
vector< pair<unsigned int, int> >::iterator it;
for (it = H[r].begin(); it != H[r].end(); it++)
if (it->first == X)
return it->second;
return -1;
}
int main(void)
{
int i, j, l;
char buf[64];
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d\n", &N, &L, &U);
for (i = 1; i <= N; i++)
{
fgets(buf, sizeof(buf), stdin);
l = strlen(buf);
for (j = 0; j < l; j++)
if (buf[j] >= '0' && buf[j] <= '9')
v[i] = v[i] * 10 + (buf[j] - '0');
else break;
}
for (i = 1, l = 0; i <= N; i++)
{
j = cheie(v[i]);
if (j == -1)
{ l++; H[v[i] % MOD].push_back(make_pair(v[i], l)); v[i] = l; }
else v[i] = j;
}
printf("%lld\n", check(U) - check(L-1));
return 0;
}