Cod sursa(job #3348103)

Utilizator Lex._.Lex Guiman Lex._. Data 19 martie 2026 17:57:37
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>
#define NMAX 1048576
#define MOD 1000003
using namespace std;

ifstream in("secv5.in");
ofstream out("secv5.out");

int v[NMAX+1];

struct element
{
    int val, cnt, next;
};

struct hash_table
{
    element elemente[NMAX+1];
    int idx=0, last_pos[MOD];
    int sz=0;

    void insert(int x)
    {
        int mod=x%MOD;
        for(int pos=last_pos[mod]; pos!=0; pos=elemente[pos].next)
        {
            if(elemente[pos].val==x)
            {
                elemente[pos].cnt++;
                return;
            }
        }
        idx++;
        elemente[idx].val=x;
        elemente[idx].next=last_pos[mod];
        elemente[idx].cnt=1;
        last_pos[mod]=idx;
        sz++;
    }

    void erase(int x)
    {
        int mod=x%MOD;
        for(int pos=last_pos[mod]; pos!=0; pos=elemente[pos].next)
        {
            if(elemente[pos].val==x)
            {
                elemente[pos].cnt--;
                if(elemente[pos].cnt==0)
                {
                    swap(elemente[pos].val, elemente[last_pos[mod]].val);
                    swap(elemente[pos].cnt, elemente[last_pos[mod]].cnt);
                    last_pos[mod]=elemente[last_pos[mod]].next;
                    sz--;
                    return;
                }
            }
        }
    }
} hash1, hash2;


int main()
{
    int n, l, u;
    in >> n >> l >> u;
    int st=1, dr=1;
    long long nr_subsecv=0;
    for(int i=1; i<=n; i++)
    {
        in >> v[i];
        hash1.insert(v[i]);
        hash2.insert(v[i]);
        while(hash1.sz>u && st<=i)
        {
            hash1.erase(v[st]);
            st++;
        }
        while(hash2.sz>=l && dr<=i)
        {
            hash2.erase(v[dr]);
            dr++;
        }
        nr_subsecv+=dr-st;
    }
    out << nr_subsecv;

    return 0;
}