Cod sursa(job #2906728)

Utilizator maria-marianita.cucos@s.unibuc.roCucos Marianita [email protected] Data 27 mai 2022 08:54:36
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 1.33 kb

#include <bits/stdc++.h>

using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

const int NMAX((1 << 20) + 5), MOD(666013);
vector<pair<unsigned int, int> > HashK[MOD];

unsigned int v[NMAX];
int n, l, u, nrD;

void adauga(unsigned int vv, int addd){
    int unde = vv % MOD;
    for(auto &it: HashK[unde])
        if(it.first == vv){
            it.second += addd;
            if(it.second == 0)
                --nrD;
            else if(it.second == 1 && addd == 1)
                ++nrD;
            return;
        }
    ++nrD;
    HashK[unde].push_back({vv, 1});
}

long long nrSecv(int lim)
{
    if(lim == 0)
        return 0;
    for(int i = 0; i < MOD; ++i)
        HashK[i].clear();
    int p1 = 1, p2 = 1;
    long long rez = 1;
    nrD = 0;
    adauga(v[p1], 1);
    while(p2 < n)
    {
        ++p2;
        adauga(v[p2], 1);
        if(nrD <= lim)
            rez += p2 - p1 + 1;
        else
        {
            while(p1 <= p2 && nrD > lim)
            {
                adauga(v[p1], -1);
                ++p1;
            }
            rez += p2 - p1 + 1;
        }
    }
    return rez;
}

int main()
{
    fin >> n >> l >> u;

    for(int i = 1; i <= n; ++i)
        fin >> v[i];

    fout << nrSecv(u) - nrSecv(l - 1) << '\n';
    return 0;
}