Pagini recente » Cod sursa (job #3355934) | Cod sursa (job #1058637) | Cod sursa (job #1318595) | Cod sursa (job #2765725) | Cod sursa (job #3310733)
/*
https://infoarena.ro/problema/secv5
*/
#include <fstream>
using namespace std;
const int N = 1 << 20;
const int M = 666019;
const int NIL = -1;
struct nod
{
int info, nr;
int urm;
};
nod v_nod[N];
int lst[M], n_v_nod;
int v[N], n;
void init_liste()
{
for (int i = 0; i < M; i++)
{
lst[i] = NIL;
}
}
int poz_in_v_nod(int val)
{
int c = val % M;
int p = lst[c];
while (p != NIL)
{
if (v_nod[p].info == val)
{
return p;
}
p = v_nod[p].urm;
}
return NIL;
}
int adauga(int val)
{
int p = poz_in_v_nod(val);
if (p != NIL)
{
v_nod[p].nr++;
return p;
}
int c = val % M;
v_nod[n_v_nod].info = val;
v_nod[n_v_nod].nr = 1;
v_nod[n_v_nod].urm = lst[c];
lst[c] = n_v_nod++;
return n_v_nod - 1;
}
int sterge(int val)
{
int p = poz_in_v_nod(val);
v_nod[p].nr--;
return p;
}
long long nr_secv(int nr_d)
{
init_liste();
int j = 0, dist = 0;
long long nr_s = 0;
for (int i = 0; i < n; i++)
{
int p = adauga(v[i]);
if (v_nod[p].nr == 1)
{
dist++;
}
while (j <= i && dist > nr_d)
{
p = sterge(v[j]);
if (v_nod[p].nr == 0)
{
dist--;
}
j++;
}
nr_s += (i - j + 1);
}
return nr_s;
}
int main()
{
ifstream in("secv5.in");
ofstream out("secv5.out");
int a, b;
in >> n >> a >> b;
for (int i = 0; i < n; i++)
{
in >> v[i];
}
out << nr_secv(b) - nr_secv(a - 1) << "\n";
in.close();
out.close();
return 0;
}