Cod sursa(job #1243862)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 16 octombrie 2014 15:30:54
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <cstdio>
#include <vector>
using namespace std;
#define MOD 666013

unsigned long N, L, U;
unsigned long tot, t, crt, rez;
vector<unsigned long> v;
vector<unsigned long> h[MOD];
vector<unsigned long> a[MOD]; // de cate ori apar

inline unsigned long hashv(unsigned long val) {
    return val % MOD;
}

inline bool verif(unsigned long val) {
    if(h[hashv(val)].empty())
        return false;
    unsigned long i;
    for(i = 0; i < h[hashv(val)].size(); i++)
        if(val == h[hashv(val)][i])
            return true;
    return false;
}

inline bool put(unsigned long val) {
    unsigned long i;
    if(!verif(val)) {
        h[hashv(val)].push_back(val);
        a[hashv(val)].push_back(1);
        return true;
    } else {
        for(i = 0; i < h[hashv(val)].size(); i++) {
            if(h[hashv(val)][i] == val)
                a[hashv(val)][i]++;
        }
    }
    return false;
}

inline bool remove(unsigned long val) {
    unsigned long i;
    if(verif(val)) {
        for(i = 0; i < h[hashv(val)].size(); i++) {
            if(h[hashv(val)][i] == val) {
                a[hashv(val)][i]--;
                if(a[hashv(val)][i] == 0) {
                    a[hashv(val)].erase(a[hashv(val)].begin() + i);
                    h[hashv(val)].erase(h[hashv(val)].begin() + i);
                    return true;
                }
                break;
            }
        }
    }
    return false;
}

int main() {
    long i, j, pozl;
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    scanf("%lu %lu %lu", &N, &L, &U);
    for(i = 0; i <= N; i++) {
        scanf("%lu", &t);
        v.push_back(t);
    }
    i = -1;
    j = 0;
    while(true) {
        if(crt <= U && i < (long) N) {
            i++;
            if(put(v[i]))
                crt++;
            tot += (i - j + 1);
        } else {
            j++;
            if(remove(v[j - 1]))
                crt--;
        }
        if(j == N - 1)
            break;
    }
    rez = tot;
    /*while(j <= i){
        remove(v[j]);
        j++;
    }*/
    for(i = 0; i < MOD; i++) {
        h[i].clear();
        a[i].clear();
    }
    i = -1;
    j = 0;
    crt = 0;
    tot = 0;
    while(true) {
        if(crt < L && i < (long) N) {
            i++;
            if(put(v[i]))
                crt++;
            tot += (i - j + 1);
        } else {
            j++;
            if(remove(v[j - 1]))
                crt--;
        }
        if(j == N - 1)
            break;
    }
    rez = rez - tot;
    printf("%ld\n", rez);
    return 0;
}