Cod sursa(job #2948303)

Utilizator andrei81Ragman Andrei andrei81 Data 27 noiembrie 2022 16:10:53
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <unordered_map>

using namespace std;

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

int n, u, l, a[(1 << 20) + 5];

int Count(int val)
{
    int j = 1, nr = 0, last = -1;
    long long ans = 0;
    unordered_map<unsigned int, int> umap;

    for ( int i = 1; i <= n; i++ )
    {
        if ( umap[a[i]] == 0 ) nr++;
        ++umap[a[i]];

        if ( nr > val )
        {
            //cout << i << " " << j << "   " << 1ll * (i - j) * (i - j + 1) / 2 - ( int )(last != -1) * 1ll * (last - j) * (last - j + 1) / 2 << endl;
            ans += 1ll * (i - j) * (i - j + 1) / 2 - ( int )(last != -1) * 1ll * (last - j) * (last - j + 1) / 2;
            last = i;

            while ( j < i && nr > val )
            {
                --umap[a[j]];
                if ( umap[a[j]] == 0 ) nr--;
                j++;
            }
        }
    }
    //cout << n + 1 << " " << j << "   " << 1ll * (n + 1 - j) * (n + 1 - j + 1) / 2 - ( int )(last != -1) * 1ll * (last - j) * (last - j + 1) / 2 << endl;
    ans += 1ll * (n + 1 - j) * (n + 1 - j + 1) / 2 - ( int )(last != -1) * 1ll * (last - j) * (last - j + 1) / 2;
    return ans;
}

int main()
{
    fin >> n >> l >> u;

    for ( int i = 1; i <= n; i++ )
        fin >> a[i];

    fout << Count(u) - Count(l - 1);
}