Pagini recente » Cod sursa (job #1553850) | Cod sursa (job #168707) | Cod sursa (job #1383843) | Cod sursa (job #2108231) | Cod sursa (job #906278)
Cod sursa(job #906278)
#include<cstdio>
#include<cstring>
#include<vector>
#define M 666013
#define NMax (1<<20)+5
using namespace std;
typedef vector<pair<unsigned,int> >::iterator IT;
unsigned v[NMax];
int n,l,u;
vector<pair<unsigned,int> > a[M];
IT poz[NMax];
inline vector<pair<unsigned,int> >::iterator find (unsigned x)
{
IT it;
for (it=a[v[x]%M].begin(); it!=a[v[x]%M].end(); ++it)
if (it->first==v[x])
return it;
return a[v[x]%M].end();
}
inline vector<pair<unsigned,int> >::iterator check (unsigned x)
{
IT it=poz[x];
if (v[x]==it->first)
return it;
return find(x);
}
void hash ()
{
for (int i=1; i<=n; i++)
{
IT it;
it=find(i);
if (it==a[v[i]%M].end())
{
a[v[i]%M].push_back(make_pair(v[i],0));
it=find(i);
}
poz[i]=it;
}
}
void reset (int x)
{
IT it;
int i;
for (i=x; i<=n; i++)
{
it=check(i);
it->second=0;
}
}
long long sol (int x)
{
IT it;
if (!x) return 0;
int nr=1,st=1,i;
long long sum=1,aux;
it=check(1);
it->second=1;
for (i=2; i<=n; i++)
{
it=check(i);
if (it->second==0)
nr++;
it->second++;
while (nr>x)
{
it=check(st);
if (it->second==1)
nr--;
it->second--;
st++;
}
aux=(long long)(i-st+1);
sum+=aux;
}
if (x==u) reset(st);
return sum;
}
int main ()
{
char s[10];
int i,lg,j;
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%d%d%d",&n,&l,&u);
for (i=1; i<=n; i++)
{
scanf("%s",s);
lg=strlen(s);
for (j=0; j<lg; j++)
v[i]=v[i]*10+(s[j]-'0');
}
hash();
printf("%lld\n",sol(u)-sol(l-1));
return 0;
}