Cod sursa(job #1146107)

Utilizator felixiPuscasu Felix felixi Data 18 martie 2014 18:32:34
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <algorithm>
#include <fstream>

using namespace std;

ifstream in("secv5.in");
ofstream out("secv5.out");

const int NMAX= (1<<20);

struct POZ {
    unsigned int val,poz;
};

bool comp( POZ a, POZ b ) {
    if( a.val == b.val ) return a.poz < b.poz;
    return a.val < b.val;
}

unsigned int a[NMAX+1], f[NMAX+1];
POZ v[NMAX+1];
int N, L, U;

void Norm() {
    sort( v+1, v+N+1, comp );
    for( int i= 1;  i<=N;  i++ ) {
        a[ v[i].poz ]= a[ v[i-1].poz ] + !( v[i].val==v[i-1].val );
    }
}

long long Gogu( int p ) {
    long long sol= 0LL;

    for( int i= 0;  i<NMAX;  i++ ) {
        f[i]= 0;
    }

    int st= 1, dr= 0, cn= 0;

    while( dr <= N && cn <= p ) {
        ++dr;
        if( ++f[ a[dr] ] == 1 ) {
            ++cn;
        }
    }
    sol+= dr-st;

    if( --f[ a[st] ] == 0 ) --cn;
    ++st;

    while( dr <= N ) {
        while( cn > p ) {
            sol+= dr-st;
            if( --f[ a[st] ] == 0 ) --cn;
            ++st;
        }
        while( dr <= N && cn <= p ) {
            ++dr;
            if( ++f[ a[dr] ] == 1 ) cn++;
        }
    }

    while( st <= N ) {
        sol+= dr-st;
        ++st;
    }

    return sol;
}

void citeste() {
    in >> N >> L >> U;
    for( int i= 1;  i<=N;  i++ ) {
        in >> a[i];
        v[i].val= a[i];
        v[i].poz= i;
    }
}

int main() {
    citeste();
    Norm();
    out << Gogu( U ) - Gogu( L-1 ) << '\n';
}