Pagini recente » Cod sursa (job #877201) | Cod sursa (job #291713) | Cod sursa (job #603778) | Cod sursa (job #2396531) | Cod sursa (job #2729281)
#include <stdio.h>
#include <stdlib.h>
#define M 666019
#define N (1 << 20)
unsigned int v[N], val[N+1], nrap[N+1], urm[N+1], lst[M], nr, n;
int exista(int x)
{
int c = x % M;
int p = lst[c];
while (p != 0)
{
if (x == val[p])
{
return p;
}
p = urm[p];
}
return 0;
}
int adauga(int x)
{
int p = exista(x);
if (p != 0)
{
nrap[p]++;
return p;
}
int c = x % M;
val[++nr] = x;
nrap[nr] = 1;
urm[nr] = lst[c];
lst[c] = nr;
return nr;
}
int sterge(int x)
{
int p = exista(x);
nrap[p]--;
return p;
}
long long nrsecv(unsigned int d)
{
unsigned int i, j = 0, p, nrd = 0;
long long rez = 0;
for (i = 0; i < M; i++)
{
lst[i] = 0;
}
nr = 0;
for (i = 0; i < n; i++)
{
p = adauga(v[i]);
if (nrap[p] == 1)
{
nrd++;
}
while (j <= i && nrd > d)
{
p = sterge(v[j++]);
if (nrap[p] == 0)
{
nrd--;
}
}
rez += i - j + 1;
}
return rez;
}
int main()
{
FILE *in, *out;
unsigned int l, u, i;
in = fopen("secv5.in", "r");
out = fopen("secv5.out", "w");
fscanf(in, "%u%u%u", &n, &l, &u);
for (i = 0; i < n; i++)
{
fscanf(in, "%u", &v[i]);
}
fclose(in);
fprintf(out, "%lld", nrsecv(u) - nrsecv(l-1));
fclose(out);
return 0;
}