Pagini recente » Cod sursa (job #3355355) | Cod sursa (job #3330699) | Cod sursa (job #121920) | Cod sursa (job #245347) | Cod sursa (job #3319306)
//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;
}