Cod sursa(job #1061482)

Utilizator costinbanuCostin Banu costinbanu Data 19 decembrie 2013 20:44:25
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <cstring>
#include <list>
#include <set>
using namespace std;

typedef pair<unsigned, unsigned> pere;
typedef list<pere> Hash;
typedef Hash::iterator hit;

const int NMAX = (1 << 20) + 1, MOD = 666013;

Hash h[MOD];
int N, L, U, used[NMAX];
unsigned unic[NMAX];

unsigned find(unsigned val) {
    unsigned rez = 0, x = val % MOD;
    for(hit i = h[x].begin(); i != h[x].end() && !rez; i++)
        if (i->first == val)
            rez = i->second;
    return rez;
}

long long lung(unsigned x) {
    if (x == 0) return 0LL;
    unsigned nr = 0u;
    long long sol = 0LL;
    memset(used, 0, sizeof(used));
    for(int start = 2, stop = 1; stop <= N; stop++) {
        used[unic[stop]]++;
        if (used[unic[stop]] == 1) nr++;
        for(; nr > x; start++) {
            used[unic[start-1]]--;
            if (used[unic[start-1]] == 0) nr--;
        }
        sol += 2LL + stop - start;
    }
    return sol;
}

int main() {
    ifstream f("secv5.in");
    ofstream g("secv5.out");
    unsigned k, nr = 1, x, poz;
    f >> N >> L >> U;
    for (int i = 1; i <= N; i++) {
        f >> k;
        x = k % MOD;
        poz = find(k);
        if (poz) unic[i] = poz;
        else {
            unic[i] = nr;
            h[x].push_back(pere(k, nr++));
        }
    }
    g << lung(U) - lung(L - 1);
    f.close();
    g.close();
    return 0;
}