Pagini recente » Cod sursa (job #903359) | Cod sursa (job #1617747) | Cod sursa (job #1056752) | Cod sursa (job #1144795) | Cod sursa (job #614913)
Cod sursa(job #614913)
#include <cstdio>
#include <cstring>
#define MOD 666013
#define NMAX 1050000
struct node
{
int val, curentpoz;
node *next;
} *H[MOD];
int v[NMAX];
int curent;
int n, l, u;
int ap[NMAX];
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, n*sizeof(int));
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;
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d", &n, &l, &u);
curent = 1;
for(i=0;i<n;++i)
{
scanf("%u", &x);
v[i] = add(x);
}
printf("%lld", nrsecv(u) - nrsecv(l-1));
return 0;
}