Cod sursa(job #2735338)

Utilizator Albert_GAlbert G Albert_G Data 2 aprilie 2021 11:50:25
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>

using namespace std;

const int M = 666019;
const int N = (1 << 20) + 1;

struct element
{
    unsigned int val, urm, nrap;
};

element h[N];
int lst[M], n, nr;
unsigned int v[N];

void reset_lst()
{
    nr = 0;
    for (int i = 0; i < M; i++)
    {
        lst[i] = 0;
    }
}

int cauta(unsigned int x)
{
    int c = x % M;
    int p = lst[c];
    while (p != 0)
    {
        if (h[p].val == x)
        {
            return p;
        }
        p = h[p].urm;
    }
    return 0;
}

int adauga(unsigned int x)
{
    int p = cauta(x);
    if (p == 0)//nu l-am adaugat in h pana acum pe x
    {
        int c = x % M;
        h[++nr].val = x;
        h[nr].nrap = 0;
        h[nr].urm = lst[c];
        lst[c] = nr;
        p = nr;
    }
    h[p].nrap++;
    return p;
}

int sterge(unsigned int x)
{
    int p = cauta(x);//stiu ca nu va returna 0
    h[p].nrap--;
    return p;
}

long long nr_secv(int x)
{
    reset_lst();
    //calculeaza nr. de ssecv cu cel mult x elemente distincte
    int j = 0, nrd = 0;
    long long nrs = 0;
    for (int i = 0; i < n; i++)
    {
        int p = adauga(v[i]);
        if (h[p].nrap == 1)
        {
            nrd++;
        }
        while (j <= i && nrd > x)
        {
            int q = sterge(v[j]);
            if (h[q].nrap == 0)
            {
                nrd--;
            }
            j++;
        }
        nrs += i - j + 1;
    }
    return nrs;
}

int main()
{
    ifstream in("secv5.in");
    ofstream out("secv5.out");
    int l, u;
    in >> n >> l >> u;
    for (int i = 0; i < n; i++)
    {
        in >> v[i];
    }
    in.close();
    out << nr_secv(u) - nr_secv(l - 1);
    out.close();
    return 0;
}