Mai intai trebuie sa te autentifici.

Cod sursa(job #2450551)

Utilizator petrisorvmyVamanu Petru Gabriel petrisorvmy Data 23 august 2019 17:01:39
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <unordered_map>
#include <vector>
#include <algorithm>
#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],v2[(1 << 20) + 1],  hash_size;
unordered_map <ll,ll> norm;


void normalizare()
{
    sort(v2 + 1, v2 + n + 1);
    int p = 0;
    for(int i = 1; i <= n; ++i)
    {
        if(v2[i] != v2[i-1]) p++;
        norm[v2[i]] = p;
    }
}
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];
        v2[i] = v[i];
    }
    normalizare();
    for(int i = 1; i <= n; ++i)
        v[i] = norm[v[i]];
    g << secv(r) - secv(l - 1);
    return 0;
}