Cod sursa(job #2906867)

Utilizator Marius_TillingerTillinger Marius Marius_Tillinger Data 27 mai 2022 17:12:57
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
 
using namespace std;
 
ifstream f("secv5.in");
ofstream g("secv5.out");
 
const int NMAX((1 << 20) + 5), MOD(666013);
vector<pair<unsigned int, int> > Hash[MOD];
 
unsigned int v[NMAX];
int n, l, u, nrD;
 
void add(unsigned int vv, int addd){
    int unde = vv % MOD;
    for(auto &it: Hash[unde])
        if(it.first == vv){
            it.second += addd;
            if(it.second == 0)
                nrD--;
            else if(it.second == 1 && addd == 1)
                nrD++;
            return;
        }
    nrD++;
    Hash[unde].push_back({vv, 1});
}
 
long long nrSecv(int lim)
{
    if(lim == 0)
        return 0;
    for(int i = 0; i < MOD; ++i)
        Hash[i].clear();
    int p1 = 1, p2 = 1;
    long long rez = 1;
    nrD = 0;
    add(v[p1], 1);
    while(p2 < n)
    {
        p2++;
        add(v[p2], 1);
        if(nrD <= lim)
            rez += p2 - p1 + 1;
        else
        {
            while(p1 <= p2 && nrD > lim)
            {
                add(v[p1], -1);
                p1++;
            }
            rez += p2 - p1 + 1;
        }
    }
    return rez;
}
 
int main()
{
    f >> n >> l >> u;
 
    for(int i = 1; i <= n; ++i)
        f >> v[i];
 
    g << nrSecv(u) - nrSecv(l - 1) << '\n';
    return 0;
}