Pagini recente » Cod sursa (job #1555057) | Cod sursa (job #3281931) | Cod sursa (job #282860) | Cod sursa (job #571436) | Cod sursa (job #1209170)
#include <cstdio>
#include <vector>
using namespace std;
#define UI unsigned int
#define NMAX (1<<24)
#define MOD 10003
UI N,positions,i,left,right,diferite,start,finish,limita;
UI A[NMAX],nxt[NMAX];
vector < UI > H[MOD];
bool is;
long long total;
UI function(UI step)
{
if (step==N)
{
nxt[step]=N;
return N;
}
if (A[step+1]!=A[step])
{
nxt[step]=step+1;
return nxt[step];
}
++positions;
nxt[step]=function(step+1);
}
bool find(int X)
{
int j;
for (j=0;j<H[X%MOD].size();++j)
if (H[X%MOD][j]==X)
return true;
return false;
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%u%u%u",&N,&left,&right);
for (i=1;i<=N;++i)
scanf("%u",&A[i]);
for (i=1;i<N;)
{
if (A[i+1]!=A[i])
{
nxt[i]=i+1;
++i;
continue;
}
positions=1;
nxt[i]=function(i+1);
i+=positions;
}
nxt[N]=N;
i=1;
while (diferite<left && i<=N)
{
is=find(A[i]);
if (!is)
{
++diferite;
H[A[i]%MOD].push_back(A[i]);
}
++i;
}
start=i-1;
for (i=0;i<MOD;++i)
while (!H[i].empty()) H[i].pop_back();
i=1;
diferite=0;
while (diferite<=right && i<=N)
{
is=find(A[i]);
if (!is)
{
++diferite;
H[A[i]%MOD].push_back(A[i]);
}
++i;
}
finish=i-1;
for (i=0;i<MOD;++i)
while (!H[i].empty()) H[i].pop_back();
i=N;
diferite=0;
while (diferite<left && i>=1)
{
is=find(A[i]);
if (!is)
{
++diferite;
H[A[i]%MOD].push_back(A[i]);
}
--i;
}
limita=i+1;
total=finish-start+1;
for (i=2;i<=limita;++i)
{
if (A[i]==A[i-1])
{
total+=finish-start+1;
continue;
}
start=nxt[start];
finish=nxt[finish];
total+=1LL*(finish-start+1);
}
printf("%lld\n",total);
return 0;
}