Cod sursa(job #3154681)

Utilizator NiffSniffCojocaru Calin Marcu NiffSniff Data 5 octombrie 2023 16:58:21
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <vector>
using namespace std;
string file = "secv5";
ifstream cin(file + ".in");
ofstream cout(file + ".out");
typedef long long ll;
const ll k = 1<<16, N = 1<<20;

struct ura{
    ll nr
    int ap;
}val[N+1];
ll lst[k], urm[N+1], nr, v[N+1],n;

int pozitie(int cal,ll numar)
{
    for (int p = lst[cal]; p; p = urm[p])
    {
        if (val[p].nr == numar)
        {
            return p;
        }
    }
    return 0;
}

void adauga(int cal,ll numar)
{
    nr++;
    val[nr] = {numar,1};
    urm[nr] = lst[cal];
    lst[cal] = nr;
}
void sterge(int cal, int p)
{
    val[p] = val[lst[cal]];
    lst[cal] = urm[lst[cal]];

}

ll secv_pana_la(ll dmax)
{
    int st = 1, dr = 1;
    ll nr_secv(0), distincte(0);
    for (; dr<=n; dr++)
    {
        int cal = v[dr] & (k-1), p = pozitie(cal,v[dr]);
        if (p == 0) // nu exista
        {
            adauga(cal,v[dr]);
            distincte++;
            while (distincte > dmax)
            {
                cal = v[st] & (k-1),p = pozitie(cal,v[st]);
                val[p].ap--;
                if (val[p].ap == 0)
                {
                    sterge(cal,p);
                    distincte--;
                }
                st++;
            }
        }
        else
        {
            val[p].ap++;
        }
        nr_secv += dr-st+1;
    }
    return nr_secv;
}

void reseteaza()
{
    while(nr)
    {
        urm[nr] = val[nr].ap = val[nr].nr = 0;
        nr--;
    }
    for (int i=1; i<=k; i++)
    {
        lst[i] = 0;
    }
}
int main ()
{
    int l,u,x;
    ll r1(0), r2(0);
    cin >> n >> l >> u;
    for (int i=1; i<=n; i++)
        cin >> v[i];
    r1 = secv_pana_la(u);
    reseteaza();
    r2 = secv_pana_la(l-1);
    cout << r1 - r2;
}