Pagini recente » Cod sursa (job #844045) | Cod sursa (job #849985) | Monitorul de evaluare | Cod sursa (job #2081601) | Cod sursa (job #537066)
Cod sursa(job #537066)
#include<fstream>
#define DIM 1050003
#define K 1000000
#include<vector>
using namespace std;
vector<pair<unsigned,int> >G[DIM];
int frecv1[DIM],frecv2[DIM],L,U;
unsigned v[DIM];
long long sol,n;
void solve();
void normalizare();
ofstream fout("secv5.out");
int main()
{
ifstream fin("secv5.in");
fin>>n>>L>>U;
int i;
for(i=1;i<=n;i++)
fin>>v[i];
normalizare();
solve();
fout<<sol;
return 0;
}
void normalizare()
{
int i,j,k,bau=1;
for(i=1;i<=n;i++)
{
int pp=0;
k=v[i]%K;
for(j=0;j<G[k].size() && pp==0;j++)
if(G[k][j].first==v[i])
v[i]=G[k][j].second,pp=1;
if(!pp)
{
G[k].push_back(make_pair(v[i],bau));
v[i]=bau;
bau++;
}
}
}
void solve()
{
int Ll=0,Uu=0,i=1,ptl,ptu;
while(Uu!=U+1 && i<=n)
{
if(Ll<L)
{
frecv1[v[i]]++,frecv2[v[i]]++;
if(frecv1[v[i]]==1)
Ll++,Uu++;
}
else
{
frecv2[v[i]]++;
if(frecv2[v[i]]==1)
Uu++;
}
if(Ll==L && Uu==L)
ptl=i;
if(Uu==U+1)
ptu=i-1;
i++;
}
if(i==n+1)
ptu=n;
sol+=(ptu-ptl+1);
for(i=2;i<=n && ptl<=n;i++)
{
frecv1[v[i-1]]--;
frecv2[v[i-1]]--;
if(frecv1[v[i-1]]==0)
Ll--;
if(frecv2[v[i-1]]==0)
Uu--;
while(Ll!=L && ptl<=n)
{
ptl++;
frecv1[v[ptl]]++,frecv2[v[ptl]]++;
if(frecv1[v[ptl]]==1)
Ll++;
if(frecv2[v[ptl]]==1)
Uu++;
}
while(Uu!=U+1 && ptu<n)
{
ptu++;
frecv2[v[ptu]]++;
if(frecv2[v[ptu]]==1)
Uu++;
}
if(Ll==L)
sol+=ptu-ptl+1;
}
}