Cod sursa(job #3310733)

Utilizator cont_superscoalaSuperScoala cont_superscoala Data 16 septembrie 2025 12:22:39
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
/*
https://infoarena.ro/problema/secv5
*/
#include <fstream>

using namespace std;

const int N = 1 << 20;
const int M = 666019;
const int NIL = -1;

struct nod
{
    int info, nr;
    int urm;
};

nod v_nod[N];
int lst[M], n_v_nod;
int v[N], n;

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

int poz_in_v_nod(int val)
{
    int c = val % M;
    int p = lst[c];
    while (p != NIL)
    {
        if (v_nod[p].info == val)
        {
            return p;
        }
        p = v_nod[p].urm;
    }
    return NIL;
}

int adauga(int val)
{
    int p = poz_in_v_nod(val);
    if (p != NIL)
    {
        v_nod[p].nr++;
        return p;
    }
    int c = val % M;
    v_nod[n_v_nod].info = val;
    v_nod[n_v_nod].nr = 1;
    v_nod[n_v_nod].urm = lst[c];
    lst[c] = n_v_nod++;
    return n_v_nod - 1;
}

int sterge(int val)
{
    int p = poz_in_v_nod(val);
    v_nod[p].nr--;
    return p;
}

long long nr_secv(int nr_d)
{
    init_liste();
    int j = 0, dist = 0;
    long long nr_s = 0;
    for (int i = 0; i < n; i++)
    {
        int p = adauga(v[i]);
        if (v_nod[p].nr == 1)
        {
            dist++;
        }
        while (j <= i && dist > nr_d)
        {
            p = sterge(v[j]);
            if (v_nod[p].nr == 0)
            {
                dist--;
            }
            j++;
        }
        nr_s += (i - j + 1);
    }
    return nr_s;
}

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