Cod sursa(job #961055)

Utilizator primulDarie Sergiu primul Data 11 iunie 2013 16:37:18
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <vector>
using namespace std;
 
#define key 666013
#define in "secv5.in"
#define out "secv5.out"
#define xx first
#define yy second
#define N ((1 << 20) + 5)
 
typedef unsigned long u;
typedef pair <u, u> elem;
 
vector <elem> list[key];
u norm[N], c[2][N], L, U, n;
 
int h(u x) {
    return ((x < key) ? x : x % key);
}  
 
int search(elem x) {
    int H = h(x.xx);
    for (u i = 0; i < list[H].size(); ++i)
        if (list[H][i].xx == x.xx)
            return list[H][i].yy;
    list[H].push_back (x);
    return x.yy;
}
 
int main () {
    ifstream fin (in);
    fin >> n >> L >> U;
    for (u i = 0; i < n; ++i) {
        u x;
        fin >> x;
        norm[i] = search(elem(x,i));
    }
    u ll, uu, dl, du;
    uu = ll = dl = du = 0;
    u long long sol = 0;
    for (u i = 0; i < n; ++i) {
        while (ll < n && dl < L)
            dl += !c[0][norm[ll++]]++;
        while (uu < n && du + !c[1][norm[uu]] <= U)
            du += !c[1][norm[uu++]]++;
        if (dl >= L)
            sol += (uu - ll + 1);
        dl -= !--c[0][norm[i]];
        du -= !--c[1][norm[i]];
    }
    ofstream fout (out);
    fout << sol;
    fout.close();
    return 0;
}