Cod sursa(job #1097055)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 2 februarie 2014 21:49:56
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <map>
#include <fstream>

#define NMAX (1 << 20) + 7
#define LL unsigned long long
#define MaxChar 10000000
#define verf ( (++CharB==MaxChar) ? ( in.read(Buffer,MaxChar),CharB=0 ) : (1) )

using namespace std;

ifstream in("secv5.in");

LL n, l, u;
LL a[NMAX];
map< LL, int > H;
int CharB = MaxChar - 1;
char Buffer[MaxChar];

void cit(LL &a){
    bool ok = 0;
    for(; !((Buffer[CharB] >= '0' && Buffer[CharB] <= '9') || (Buffer[CharB] == '-')); verf)
        ;
    if(Buffer[ CharB ] == '-' ){
        ++ CharB;
        ok = 1;
    }
    for(a = 0; (Buffer[CharB] >= '0' && Buffer[CharB] <= '9'); a *= 10, a +=(Buffer[CharB] - '0'), verf);
    if(ok)
        a = -a;
}

inline LL solve(int k){
    LL Ans = 0, Number = 0;
    H.clear();
    for(LL i = 1, j = 1; i <= n; ++i){
        if(H[a[i]] > 0)
            ++ H[a[i]];
        else{
            ++ Number;
            H[a[i]] = 1;
        }
        while(Number > k){
            -- H[a[j]];
            if(H[a[j]] <= 0)
                -- Number;
            ++j;
        }
        Ans += (i - j + 1);
    }
    return Ans;
}

int main(){
    freopen("secv5.out", "w", stdout);
    cit(n); cit(l); cit(u);
    for(int i = 1; i <= n; ++i)
        cit(a[i]);
    printf("%lld\n", solve(u) - solve(l - 1));
    return 0;
}