Pagini recente » Cod sursa (job #3272227) | Cod sursa (job #2828274) | Cod sursa (job #343425) | Cod sursa (job #2312766) | Cod sursa (job #3154682)
#include <fstream>
#include <vector>
using namespace std;
string file = "secv5";
ifstream cin(file + ".in");
ofstream cout(file + ".out");
typedef long long ll;
const ll k = 1<<16, N = 1<<20;
struct ura{
ll nr;
int ap;
}val[N+1];
ll lst[k], urm[N+1], nr, v[N+1],n;
int pozitie(int cal,ll numar)
{
for (int p = lst[cal]; p; p = urm[p])
{
if (val[p].nr == numar)
{
return p;
}
}
return 0;
}
void adauga(int cal,ll numar)
{
nr++;
val[nr] = {numar,1};
urm[nr] = lst[cal];
lst[cal] = nr;
}
void sterge(int cal, int p)
{
val[p] = val[lst[cal]];
lst[cal] = urm[lst[cal]];
}
ll secv_pana_la(ll dmax)
{
int st = 1, dr = 1;
ll nr_secv(0), distincte(0);
for (; dr<=n; dr++)
{
int cal = v[dr] & (k-1), p = pozitie(cal,v[dr]);
if (p == 0) // nu exista
{
adauga(cal,v[dr]);
distincte++;
while (distincte > dmax)
{
cal = v[st] & (k-1),p = pozitie(cal,v[st]);
val[p].ap--;
if (val[p].ap == 0)
{
sterge(cal,p);
distincte--;
}
st++;
}
}
else
{
val[p].ap++;
}
nr_secv += dr-st+1;
}
return nr_secv;
}
void reseteaza()
{
while(nr)
{
urm[nr] = val[nr].ap = val[nr].nr = 0;
nr--;
}
for (int i=1; i<=k; i++)
{
lst[i] = 0;
}
}
int main ()
{
int l,u,x;
ll r1(0), r2(0);
cin >> n >> l >> u;
for (int i=1; i<=n; i++)
cin >> v[i];
r1 = secv_pana_la(u);
reseteaza();
r2 = secv_pana_la(l-1);
cout << r1 - r2;
}