Pagini recente » Cod sursa (job #1301074) | Cod sursa (job #897076) | Cod sursa (job #2689879) | Cod sursa (job #1242598) | Cod sursa (job #210613)
Cod sursa(job #210613)
using namespace std;
#include <cstdio>
#include <vector>
#define II inline
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX (1<<20)+2
#define L_MAX 1<<24
#define IN "secv5.in"
#define OUT "secv5.out"
#define MOD 666013
char buffer[L_MAX];
int V1[666022],V2[666022];
unsigned int M[N_MAX],P[N_MAX];
int K(-1),N,L,U;
II unsigned int read()
{
unsigned int aux(0);
for(;buffer[K] > '9' || buffer[K] < '0';++K);
for(;buffer[K] <= '9' && buffer[K] >= '0';++K)
aux = aux * 10 + buffer[K] - '0';
return aux;
}
II long long solve(int A)
{
int X(0),x(1);
if(P[N])
memset(V1,0,sizeof(V1)),
memset(V2,0,sizeof(V2));
FOR(i,1,N)
{
if(! (V2[ M[i] ] - V1[ M[i] ]) )
++X;
++V2[ M[i] ];
for(;X <= A && i<=N;)
{
if( !(V2[ M[i+1] ] - V1[ M[i+1] ]) && X == A)
break;
P[i] = x;
++i;
if(! (V2[ M[i] ] - V1[ M[i] ]) )
++X;
++V2[ M[i] ];
}
if(X > A+1)
exit(-1);
for(;X > A && x<=N;)
{
if( !(V2[ M[x] ] - V1[ M[x] ] - 1) )
--X;
++V1[ M[x] ];
++x;
}
if(X > A)
exit(-1);
P[i] = x;
}
long long rez(0);
FOR(i,1,N)
rez += (long long) (i-P[i]+1);
if(rez < 0)
rez = 0;
return rez;
}
int main()
{
freopen(IN, "r",stdin);
fread(buffer,1,1<<24,stdin);
fclose(stdin);
N = read();
L = read();
U = read();
FOR(i,1,N)
M[i] = read();
unsigned j,rest;
FOR(i,1,N)
{
rest = M[i] % MOD;
for(j=rest;P[j] != M[i] && P[j];++j);
P[j] = M[i];
M[i] = j;
}
freopen(OUT, "w",stdout);
printf("%lld\n", solve(U) - solve(L-1) );
return 0;
}