Pagini recente » Cod sursa (job #1005443) | Cod sursa (job #1162345) | Cod sursa (job #416450) | Cod sursa (job #870415) | Cod sursa (job #2450522)
#include <fstream>
#include <unordered_map>
#include <vector>
#define ll unsigned int
#define MOD 666013
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
int n, r,l;
ll v[(1 << 20) + 1], hash_size;
vector <pair <ll, int > > H[MOD];
vector <pair <ll, int > > :: iterator find_val(ll x)
{
vector <pair <ll, int > > :: iterator it;
for(it = H[x % MOD].begin(); it != H[x % MOD].end(); ++it)
if((*it).first == x)
return it;
return H[x % MOD].end();
}
void add(ll x)
{
vector <pair <ll, int > > :: iterator it = find_val(x);
if(it == H[x % MOD].end())
{
H[x % MOD].push_back({x,1});
hash_size++;
}
else
(*it).second++;
}
void del(ll x)
{
vector <pair <ll, int > > :: iterator it;
it = find_val(x);
if(it != H[x % MOD].end())
{
(*it).second--;
if( (*it).second == 0)
{
H[x % MOD].erase(it);
hash_size--;
}
}
}
long long secv(int lungime)
{
//unordered_map <ll,ll> hs;
for(int i = 1; i <= MOD; ++i)
H[i].clear();
hash_size = 0;
long long sol = 0;
for(int i = 1, ultim = 1; i <= n; ++i)
{
add(v[i]);
while(lungime < hash_size)
{
del(v[ultim]);
//if(!hs[v[ultim]]) hs.erase(v[ultim]);
ultim++;
}
sol = sol + (i - ultim + 1);
}
return sol;
}
int main()
{
f >> n >> l >> r;
for(int i = 1; i <= n; ++i)
f >> v[i];
g << secv(r) - secv(l - 1);
return 0;
}