Cod sursa(job #1764784)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 25 septembrie 2016 21:33:00
Problema Secventa 5 Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.35 kb
#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][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;
}