Pagini recente » Cod sursa (job #3162007) | Cod sursa (job #2356389) | Cod sursa (job #2821378) | Cod sursa (job #978694) | Cod sursa (job #2735338)
#include <fstream>
using namespace std;
const int M = 666019;
const int N = (1 << 20) + 1;
struct element
{
unsigned int val, urm, nrap;
};
element h[N];
int lst[M], n, nr;
unsigned int v[N];
void reset_lst()
{
nr = 0;
for (int i = 0; i < M; i++)
{
lst[i] = 0;
}
}
int cauta(unsigned int x)
{
int c = x % M;
int p = lst[c];
while (p != 0)
{
if (h[p].val == x)
{
return p;
}
p = h[p].urm;
}
return 0;
}
int adauga(unsigned int x)
{
int p = cauta(x);
if (p == 0)//nu l-am adaugat in h pana acum pe x
{
int c = x % M;
h[++nr].val = x;
h[nr].nrap = 0;
h[nr].urm = lst[c];
lst[c] = nr;
p = nr;
}
h[p].nrap++;
return p;
}
int sterge(unsigned int x)
{
int p = cauta(x);//stiu ca nu va returna 0
h[p].nrap--;
return p;
}
long long nr_secv(int x)
{
reset_lst();
//calculeaza nr. de ssecv cu cel mult x elemente distincte
int j = 0, nrd = 0;
long long nrs = 0;
for (int i = 0; i < n; i++)
{
int p = adauga(v[i]);
if (h[p].nrap == 1)
{
nrd++;
}
while (j <= i && nrd > x)
{
int q = sterge(v[j]);
if (h[q].nrap == 0)
{
nrd--;
}
j++;
}
nrs += i - j + 1;
}
return nrs;
}
int main()
{
ifstream in("secv5.in");
ofstream out("secv5.out");
int l, u;
in >> n >> l >> u;
for (int i = 0; i < n; i++)
{
in >> v[i];
}
in.close();
out << nr_secv(u) - nr_secv(l - 1);
out.close();
return 0;
}