Pagini recente » Cod sursa (job #2231276) | Cod sursa (job #2788077) | Cod sursa (job #2900501) | Cod sursa (job #1259258) | Cod sursa (job #2181788)
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <fstream>
#include <deque>
using namespace std;
#define nmax (1<<20)+100
ifstream f("secv5.in");
ofstream g("secv5.out");
int n,l,u,op,elem,mn;
unsigned int vect[nmax],freq[nmax],curent,last,hashes[nmax];
unsigned long long ans;
vector<unsigned int>Se;
deque<unsigned int>dif;
int main()
{
f>>n>>l>>u;
for (int i=1; i<=n; ++i)
{
f>>vect[i];
if (find(Se.begin(),Se.end(),vect[i])==Se.end())
{
Se.push_back(vect[i]);
hashes[Se.size()-1]=vect[i];
}
}
for (mn=1; mn<=n&&dif.size()<l; ++mn)
{
unsigned int localpoz=distance(Se.begin(),find(Se.begin(),Se.end(),vect[mn]));
if (freq[localpoz]==0)
dif.push_back(localpoz);
++freq[localpoz];
}
for (last=mn; last<=n&&dif.size()<u; ++last)
{
unsigned int localpoz=distance(Se.begin(),find(Se.begin(),Se.end(),vect[last]));
if (freq[localpoz]==0)
dif.push_back(localpoz);
++freq[localpoz];
}
--mn;
last=min(last,(unsigned int)n);
if (dif.size()<l)
{
g<<0;
return 0;
}
ans+=(last-mn+1);
for (int i=1; i<=n; ++i)
{
unsigned int local=distance(Se.begin(),find(Se.begin(),Se.end(),vect[i]));
--freq[local];
if (freq[local]==0)
{
for (deque<unsigned int>::iterator w=dif.begin(); w!=dif.end(); ++w)
if (*w==local)
{
dif.erase(w);
break;
}
for (last=last+1; last<=n; ++last)
{
unsigned int localpoz=distance(Se.begin(),find(Se.begin(),Se.end(),vect[last]));
if (freq[localpoz]==0)
{
dif.push_back(localpoz);
++freq[localpoz];
break;
}
++freq[localpoz];
}
if (dif.size()>=l)
{
unsigned int nxtpoz=dif[l-1];
for (;vect[mn]!=hashes[nxtpoz];++mn);
ans+=(min(last,(unsigned int)n)-mn+1);
}
else
{
g<<ans;
return 0;
}
}
else
ans+=(min(last,(unsigned int)n)-mn+1);
}
g<<ans;
return 0;
}