Cod sursa(job #2927053)

Utilizator AswVwsACamburu Luca AswVwsA Data 19 octombrie 2022 11:16:14
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
//sunt prostanac, uitai sa scad secventele care apar si dupa comprimare si inainte
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

const int NMAX = (1 << 20) + 1;

long long v[NMAX];
pair <long long, int> a[NMAX];
int f[NMAX]; //sau hash fara normalizare I guess
int n;
int ind[NMAX];
long long solve(int val)
{
    if (val == 0)
        return 0;
    int i, j;
    long long ans = 0;
    int last = -1, nr = 0;
    for (i = j = 1; j <= n; j++)
    {
        if (f[ind[j]] == 0)
            nr++;
        f[ind[j]]++;
        if (nr > val)
        {
            ans += 1LL * (j - i) * (j - i + 1) / 2 - 1LL * (last != -1) * (last - i) * (last - i + 1) / 2;
            last = j;
            while (i < j and nr > val)
            {
                if (f[ind[i]] == 1)
                    nr--;
                f[ind[i]]--;
                i++;
            }
        }
    }
    memset(f, 0, sizeof(f));
    ans += 1LL * (j - i) * (j - i + 1) / 2 - 1LL * (last != -1) * (last - i) * (last - i + 1) / 2;
    return ans;
}
signed main()
{
    ifstream cin("secv5.in");
    ofstream cout("secv5.out");
    int i, l, u;
    cin >> n >> l >> u;
    for (i = 1; i <= n; i++)
    {
        cin >> v[i];
        a[i] = {v[i], i};
    }
    sort(a + 1, a + n + 1);
    int last = 1, cnt = 1;
    for (i = 1; i <= n; i++)
    {
        if (a[i].first != a[last].first)
        {
            last = i;
            cnt++;
        }
        ind[a[i].second] = cnt;
    }
    cout << solve(u) - solve(l - 1);
}