Pagini recente » Cod sursa (job #1502757) | Cod sursa (job #847047) | Cod sursa (job #2813358) | Cod sursa (job #2945124) | Cod sursa (job #1058382)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
const int mod=666013,vmax=(1<<20)+5;
unsigned int n,l,u,v[vmax],limx[vmax],limy[vmax],dx,dy,dist,sol=0;
vector <unsigned int> h[mod],ap[mod];
void Read()
{ int i;
f>>n>>l>>u;
for(i=1;i<=n;i++)
f>>v[i];
}
void Del(int x)
{ int i,l=x%mod;
for(i=0;i<h[l].size();i++)
if (h[l][i]==x)
{ ap[l][i]--;
if (!ap[l][i])
{ h[l][i]=h[l][h[l].size()-1];
ap[l][i]=ap[l][ap[l].size()-1];
h[l].pop_back();
ap[l].pop_back();
dist--;
}
}
}
void Add(int x)
{ int i,l=x%mod,found=0;
for(i=0;i<h[l].size();i++)
if (h[l][i]==x)
{ap[l][i]++;
found=1;}
if (!found)
{ dist++;
h[l].push_back(x);
ap[l].push_back(1);
}
}
void Solve()
{ int i;
dx=0; dist=0;
for(i=1;i<=n;i++)
{
if (i>1) Del(v[i-1]);
while(dist<l && dx+1<=n)
{dx++; Add(v[dx]);}
if (dist>=l)
limx[i]=dx;
else limx[i]=-1;
//cout<<limx[i]<<"\n";
}
Del(v[n]);
dist=0; dx=0;
for(i=1;i<=n;i++)
{
if (i>1) Del(v[i-1]);
while(dist<=u && dx+1<=n)
{dx++; Add(v[dx]);}
if (dist>u) {Del(v[dx]); dx--;}
if (dist>=l)
limy[i]=dx;
else limy[i]=-1;
//cout<<limy[i]<<"\n";
}
Del(v[n]);
for(i=1;i<=n;i++)
if (limx[i]!=-1 && limy[i]!=-1)
sol+=limy[i]-limx[i]+1;
}
int main()
{ Read();
Solve();
g<<sol<<"\n";
return 0;
}