Pagini recente » Cod sursa (job #197897) | Cod sursa (job #2333902) | Cod sursa (job #2504145) | Cod sursa (job #302296) | Cod sursa (job #1764775)
#include <stdio.h>
#define nmax ( 1 << 20 )
#define mod 702113
unsigned int v[nmax+1];
unsigned int val[2][nmax];
int next[2][nmax+1];
int frecv[2][nmax+1];
int lasthash[2][mod];
int poz, size, n, start, stop, ver;
int caut( unsigned int nr ){
unsigned int h = nr % mod;
int pozcaut = lasthash[ver][h];
while( pozcaut!=0 && val[ver][pozcaut]!=nr )
pozcaut = next[ver][pozcaut];
return pozcaut;
}
void insert( unsigned int nr ){
int pozinsert = caut( nr );
unsigned int h = nr % mod;
if( pozinsert!=0 && frecv[ver][pozinsert]!=0 )
frecv[ver][pozinsert]++;
else{
val[ver][++poz] = nr;
next[ver][poz] = lasthash[ver][h];
lasthash[ver][h] = poz;
frecv[ver][poz] = 1;
size++;
}
}
/*
void sterge( unsigned int nr ){
int pozsters = lasthash[ver][nr%mod];
if( val[ver][pozsters]==nr ){
frecv[ver][pozsters]--;
if( frecv[ver][pozsters]==0 ){
lasthash[ver][nr%mod] = next[ver][pozsters];
size--;
}
}
else{
while( pozsters!=0 && val[ver][pozsters]!=nr )
pozsters = next[ver][pozsters];
if( pozsters!=0 ){
frecv[ver][pozsters]--;
if( frecv[ver][pozsters] == 0 ){
size--;
next[ver][pozsters] = next[ next[ver][pozsters]];
}
}
}
}
*/
void sterge( unsigned int nr ){
int pozsters = caut( nr );
frecv[ver][pozsters]--;
if( frecv[ver][pozsters]==0 )
size--;
}
long long lung( int max ){
poz = size = 0;
int pozst = 0;
long long co = 0LL;
int i;
for( i=0; i<n; i++ ){
insert( v[i] );
while( size > max ){
sterge( v[pozst] );
pozst++;
}
co += i - pozst + 1;
}
return co;
}
int main()
{
long long co;
int i;
FILE *fin, *fout;
fin = fopen( "secv5.in", "r" );
fscanf( fin, "%d%d%d", &n, &start, &stop );
for( i=0; i<n; i++ )
fscanf( fin, "%u", &v[i] );
fclose( fin );
ver = 0;
co = lung( stop );
ver = 1;
co -= lung( start - 1 );
fout = fopen( "secv5.out", "w" );
fprintf( fout, "%lld\n", co );
fclose( fout );
return 0;
}