Pagini recente » Cod sursa (job #1808400) | Cod sursa (job #750152) | Cod sursa (job #1189274) | Cod sursa (job #2127604) | Cod sursa (job #1315868)
#include <fstream>
#include <list>
using namespace std;
#define NMax 1048580
#define MOD 666013
ifstream f("secv5.in");
ofstream g("secv5.out");
struct Hash
{
unsigned int nr,ap;
}q;
int n,L,U;
unsigned int v[NMax];
list<Hash> H[MOD];
list<Hash>::iterator it;
int Hsize;
void Hadd(int x)
{
int r = x%MOD;
for(it = H[r].begin(); it != H[r].end(); ++it)
if((*it).nr == x) {(*it).ap++; return;}
if(it == H[r].end())
{
q.nr = x;
q.ap = 1;
H[r].insert(it,q);
++Hsize;
}
}
void Hremove(int x)
{
int r = x%MOD;
for(it = H[r].begin(); it != H[r].end(); ++it)
if((*it).nr == x) break;
if((*it).ap == 1)
{
H[r].erase(it);
--Hsize;
}
else (*it).ap--;
}
bool ok = false;
unsigned long long secv(int x)
{
unsigned long long sol = 0;
int j = 1;
for(int i=1;i<=n;++i)
{
Hadd(v[i]);
while(x < Hsize) Hremove(v[j++]);
sol += i-j+1;
}
if(ok == false)
{
ok = true;
Hsize = 0;
for(int i=0;i<MOD;++i) H[i].clear();
}
return sol;
}
int main()
{
f>>n>>L>>U;
for(int i=1;i<=n;++i) f>>v[i];
g<<secv(U)-secv(L-1)<<"\n";
f.close();
g.close();
return 0;
}