Pagini recente » Cod sursa (job #500929) | Cod sursa (job #1578798) | Cod sursa (job #1990712) | Cod sursa (job #3001377) | Cod sursa (job #2907126)
#include <iostream>
#include <vector>
#include <fstream>
const int nrMax(1048581), nmb(500009);
std::vector<std::pair<unsigned int, int> > vec[nmb];
unsigned int vector[nrMax];
int n, L, U, nrD;
void adauga(unsigned int v, int add){
int poz = v % nmb;
for(auto &pair: vec[poz])
if(pair.first == v){
pair.second += add;
if(pair.second == 0)
--nrD;
else if(pair.second == 1 && add == 1)
++nrD;
return;
}
++nrD;
vec[poz].push_back({v, 1});
}
double numarSecvente(int lim)
{
if(lim == 0)
return 0;
for(int i = 0; i < nmb; ++i)
vec[i].clear();
int p1 = 1, p2 = 1;
double subSec = 1;
nrD = 0;
adauga(vector[p1], 1);
while(p2 < n)
{
++p2;
adauga(vector[p2], 1);
if(nrD <= lim)
subSec += p2 - p1 + 1;
else
{
while(p1 <= p2 && nrD > lim)
{
adauga(vector[p1], -1);
++p1;
}
subSec += p2 - p1 + 1;
}
}
return subSec;
}
int main()
{
std::ifstream f("secv5.in");
std::ofstream g("secv5.out");
f >> n >> L >> U;
for(int i = 1; i <= n; ++i)
f >> vector[i];
g << numarSecvente(U) - numarSecvente(L - 1) << '\n';
f.close();
g.close();
return 0;
}