Pagini recente » Cod sursa (job #712290) | Cod sursa (job #486055) | Cod sursa (job #741247) | Cod sursa (job #278038) | Cod sursa (job #2924529)
#include <fstream>
#include <vector>
using namespace std;
#define Nmax 1048576
#define M 666013
int v[Nmax];
vector<pair<int, int>> Hash[M];
int pozitie(int x)
{
int cod, i;
cod = x % M;
for(i = 0; i < Hash[cod].size(); i++)
{
if(x == Hash[cod][i].first)
{
return i;
}
}
return -1;
}
void adauga(int x)
{
int cod, i;
cod = x % M;
if(pozitie(x) != -1)
{
i = pozitie(x);
Hash[cod][i].second++;
}
else
{
Hash[cod].push_back({x, 1});
}
}
void sterge(int x)
{
int cod, i;
cod = x % M;
if(pozitie(x) != -1)
{
i = pozitie(x);
if(Hash[cod][i].second > 1)
{
Hash[cod][i].second--;
}
else
{
Hash[cod].erase(Hash[cod].begin() + i);
}
}
}
int cate(int x)
{
int cod, i;
cod = x % M;
i = pozitie(x);
if(i != -1)
{
return Hash[cod][i].second;
}
else
{
return 0;
}
}
int main()
{
ifstream fin("secv5.in");
ofstream fout("secv5.out");
int n, l, u, i, j;
long long sol1, sol2, cnt;
fin >> n >> l >> u;
for(i = 0; i < n; i++)
{
fin >> v[i];
}
i = 0;
sol1 = 0;
cnt = 0;
for(j = 0; i <= j && j < n; j++)
{
if(pozitie(v[j]) == -1)
{
cnt++;
}
adauga(v[j]);
if(cnt > l - 1)
{
sol1 += (j - i + 1) * (j - i) / 2;
while(i <= j && cnt > l - 1)
{
if(cate(v[i]) == 1)
{
cnt--;
}
sterge(v[i]);
i++;
}
}
}
sol1 += (j - i + 1) * (j - i) / 2;
while(i < n)
{
sterge(v[i]);
i++;
}
i = 0;
sol2 = 0;
cnt = 0;
for(j = 0; i <= j && j < n; j++)
{
if(pozitie(v[j]) == -1)
{
cnt++;
}
adauga(v[j]);
if(cnt > u)
{
sol2 += (j - i + 1) * (j - i) / 2;
while(i <= j && cnt > l)
{
if(cate(v[i]) == 1)
{
cnt--;
}
sterge(v[i]);
i++;
}
}
}
sol2 += (j - i + 1) * (j - i) / 2;
fout << sol2 - sol1;
return 0;
}