Cod sursa(job #3319306)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 31 octombrie 2025 16:46:02
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
//https://www.nerdarena.ro/problema/secv5

#include <bits/stdc++.h>

using namespace std;

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

constexpr int NRMAX = 1 << 20;

constexpr int MOD = 1 << 16;

int n;
int64_t v[NRMAX + 5];

vector<pair<int64_t, int>> h[MOD];

bool adg(int64_t x)
{
	int nr = x & (MOD - 1);
	for (auto& it : h[nr])
	{
		if (it.first == x)
		{
			++it.second;
			return false;
		}
	}

	h[nr].push_back(make_pair(x, 1));
	return true;
}

bool scad(int64_t x)
{
	int nr = x & (MOD - 1);
	for (auto it = h[nr].begin(); it != h[nr].end(); ++it)
	{
		if (it->first == x)
		{
			--it->second;

			if(it->second == 0)
            {
                int i = it - h[nr].begin();
                swap(h[nr][i], h[nr].back());
                h[nr].pop_back();
                return true;
            }

			return false;
		}
	}

	return false;
}

int64_t rezolvare(int lun)
{
    for(int i = 0; i < MOD; ++i)
        h[i].clear();

    int i = 1, k = 0, j;
    int64_t rez = 0;


    for (j = 1; j <= n; j++)
    {
        if (adg(v[j]) == true)
        {
            //cout<<i<<" "<<j<<"\n";
            ++k;
            while (k > lun)
            {
                if(scad(v[i]) == true)
                    --k;
                ++i;
            }
        }

        rez += (j - i);
    }

    //cout<<rez<<" ";
    return rez;
}

int main()
{
    int l, u, i;

    fin >> n >> l >> u;
    for (i = 1; i <= n; i++)
    {
        fin >> v[i];
    }

    fout << rezolvare(u) - rezolvare(l - 1);

    return 0;
}