Pagini recente » Cod sursa (job #1907950) | Cod sursa (job #744992) | Cod sursa (job #2777673) | Cod sursa (job #561296) | Cod sursa (job #705895)
Cod sursa(job #705895)
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#define MAXC 13000000
#define MOD 666013
#define NMAX 1050000
using namespace std;
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;
char s[MAXC];
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);
istringstream is(s);
for(i=0;i<n;++i)
{
is>>x;
v[i] = add(x);
}
printf("%lld", nrsecv(u) - nrsecv(l-1));
return 0;
}