Pagini recente » Cod sursa (job #1828750) | Cod sursa (job #393994) | Cod sursa (job #304451) | Cod sursa (job #2420038) | Cod sursa (job #614972)
Cod sursa(job #614972)
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MOD 666013
#define NMAX 1050000
#define MAXC 30000000
struct node
{
int val, curentpoz;
node *next;
} *H[MOD];
int v[NMAX];
int curent;
int n, l, u;
int ap[NMAX];
char s[MAXC];
int add(unsigned int val)
{
node *newnode, *c;
int key = val%MOD;
for(c = H[key];c;c=c->next)
{
if(c->val == val)
{
return c->curentpoz;
}
}
newnode = new node;
newnode->val = val;
newnode->curentpoz = curent++;
newnode->next = H[key];
H[key] = newnode;
return curent-1;
}
long long nrsecv(int x) //numarul de secvente care contin cel mult x elemente distincte
{
int nr = 0, i, l = 0;
long long sum = 0;
memset(ap, 0, sizeof(ap));
for(i=0;i<n;++i)
{
if(ap[v[i]] == 0)
{
++nr;
}
++ap[v[i]];
while(nr > x)
{
if(ap[v[l]] == 1)
{
--nr;
}
--ap[v[l]];
++l;
}
sum += i - l + 1;
}
return sum;
}
int main()
{
int i;
unsigned int x;
char *cuv;
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d", &n, &l, &u);
curent = 1;
fread(s, sizeof(char), MAXC, stdin);
cuv = strtok(s, " \n");
for(i=0;i<n;++i)
{
x = atol(cuv);
v[i] = add(x);
cuv = strtok(NULL, " \n");
}
printf("%lld", nrsecv(u) - nrsecv(l-1));
return 0;
}