Cod sursa(job #2907069)

Utilizator mbrianaMerealbe Cris-Briana mbriana Data 28 mai 2022 17:21:54
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme 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;
}