Pagini recente » Cod sursa (job #18359) | Cod sursa (job #1505039) | Cod sursa (job #3239748) | Cod sursa (job #1952430) | Cod sursa (job #1764788)
#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 ){
unsigned int h = nr % mod;
int pozsters = lasthash[ver][h];
if( val[ver][pozsters]==nr ){
frecv[ver][pozsters]--;
if( frecv[ver][pozsters]==0 ){
lasthash[ver][h] = next[ver][pozsters];
size--;
}
}
else{
while( val[ver][ next[ver][pozsters] ]!=nr && next[ver][pozsters]!=0 )
pozsters = next[ver][pozsters];
if( val[ver][ next[ver][pozsters] ]==nr ){
frecv[ver][ next[ver][pozsters] ]--;
if( frecv[ver][ next[ver][pozsters] ] == 0 ){
size--;
next[ver][pozsters] = next[ver][ 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;
}