Pagini recente » Istoria paginii utilizator/my_raluca_21 | Diferente pentru utilizator/robybrasov intre reviziile 27 si 78 | Istoria paginii utilizator/skenia | Cod sursa (job #546987) | Cod sursa (job #2880212)
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <fstream>
using namespace std;
vector <unsigned int> v;
int n, l, u;
class Hash{
int nr, p;
vector <vector<unsigned int> > L;
public:
Hash()
{
nr = 0;
p = 666013;
L.resize(p);
}
int GetSize()
{
return nr;
}
void Add(int x)
{
if (!Search(x))
nr++;
int r = x % p;
L[r].push_back(x);
}
bool Search(int x)
{
int r = x % p;
for (int i = 0; i < L[r].size(); i++)
if (L[r][i] == x)
return true;
return false;
}
void Delete (int x)
{
int r = x % p;
for (int i = 0; i < L[r].size(); i++)
if (L[r][i] == x)
{
swap(L[r][i], L[r].back());
L[r].pop_back();
}
if (!Search(x))
nr--;
}
};
void Read()
{
ifstream fin ("secv5.in");
fin >> n >> l >> u;
v.resize(n);
for (int i = 0; i < n; i++)
fin >> v[i];
fin.close();
}
void Solve()
{
long long nrseqr, nrseql, i, j;
nrseqr = nrseql = 0;
j = 0;
Hash h1, h2;
for (i = 0; i < n; i++)
{
h1.Add(v[i]);
//cout << h1.GetSize() << " " << i << " " << j << "\n";
while (h1.GetSize() > u)
h1.Delete(v[j++]);
nrseqr += (i - j + 1);
}
j = 0;
for (i = 0; i < n; i++)
{
h2.Add(v[i]);
while (h2.GetSize() >= l)
h2.Delete(v[j++]);
nrseql += (i - j + 1);
}
ofstream fout ("secv5.out");
fout << nrseqr - nrseql << "\n";
fout.close();
}
int main() {
Read();
Solve();
return 0;
}