Cod sursa(job #3319299)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 31 octombrie 2025 16:27:35
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 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 << 15;

int n;
int64_t v[NRMAX + 5];

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

bool adg(int64_t x, vector<pair<int64_t, int>> (&h) [MOD])
{
	int nr = x % MOD;
	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, vector<pair<int64_t, int>> (&h) [MOD])
{
	int nr = x % MOD;
	for (auto it = h[nr].begin(); it != h[nr].end(); ++it)
	{
		if (it->first == x)
		{
			--it->second;

			if(it->second == 0)
            {
                h[nr].erase(it);
                return true;
            }

			return false;
		}
	}

	return false;
}

int64_t rezolvare(int lun, int hpoz)
{
    int i = 1, k = 0, j;
    int64_t rez = 0;

    auto &H = h[hpoz];

    for (j = 1; j <= n; j++)
    {
        if (adg(v[j], H) == true)
        {
            //cout<<i<<" "<<j<<"\n";
            ++k;
            while (k > lun)
            {
                if(scad(v[i], h[hpoz]) == 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, 0) - rezolvare(l - 1, 1);

    return 0;
}