Cod sursa(job #2561058)

Utilizator victorzarzuZarzu Victor victorzarzu Data 28 februarie 2020 16:04:54
Problema Secventa 5 Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long int unll;
ofstream g("secv5.out");

unll n , l, u;
unll lef , rig, ans;
unll v[1 << 20 + 5];
unordered_map<int,int> lf, rt;
char buffer[100005];
int p = 99999;


void read(unll &x)
{
    while(buffer[p] < '0' || buffer[p] > '9')
        {
                ++p;
    if(p == 100000)
    {
        p = 0;
        fread(buffer, 1, 100000, stdin);
    }
        }

    x = 0;

    while(buffer[p] >= '0' && buffer[p] <= '9')
    {
        x = x * 10 + buffer[p] - '0';
            ++p;
    if(p == 100000)
    {
        p = 0;
        fread(buffer, 1, 100000, stdin);
    }
    }
}

void Read()
{
    freopen("secv5.in", "r", stdin);
    read(n);
    read(l);
    read(u);
    for(int i = 1;i <= n;++i)
        read(v[i]);
}

void Solve()
{
    lef = rig = 1;
    for(int i = 1;i <= n;++i)
    {
        lf[v[i]]++;
        rt[v[i]]++;

        while(lf.size() >= l)
        {
            lf[v[lef]]--;
            if(lf[v[lef]] == 0)
                lf.erase(v[lef]);
            ++lef;
        }

        while(rt.size() > u)
        {
            rt[v[rig]]--;
            if(rt[v[rig]] == 0)
                rt.erase(v[rig]);
            ++rig;
        }

        ans += lef - rig;
    }

    g<<ans<<'\n';
}

int main()
{
    Read();
    Solve();
    return 0;
}