Cod sursa(job #671818)

Utilizator SpiderManSimoiu Robert SpiderMan Data 31 ianuarie 2012 21:58:28
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
# include <algorithm>
# include <cstdio>
# include <cstring>
# include <cassert>
# include <vector>
using namespace std;

# define x first
# define y second

typedef long long ll;
const char *FIN = "secv5.in", *FOU = "secv5.out";
const int MAX = (1 << 20) + 3;

char viz[MAX];
int N, L, U;
unsigned V[MAX];
vector < pair <unsigned, int> > srt;

ll sol (int lvl) {
    if (lvl == 0) return 0;
    memset (viz, 0, sizeof (viz));
    ll SOLVE = 0;
    for (int st = 0, dr = 0, solution = 0; dr < N; ++dr) {
        if (viz[V[dr]] == 0) solution += 1;
        for (viz[V[dr]] += 1; solution > lvl; ++st)
            if (--viz[V[st]] == 0) solution -= 1;
        SOLVE += dr - st + 1;
    }
    return SOLVE;
}

int main (void) {
    assert (freopen (FIN, "r", stdin) != NULL);

    assert (scanf ("%d %d %d", &N, &L, &U) == 3);
    for (int i = 0; i < N; ++i) {
        assert (scanf ("%u", V + i) == 1);
        srt.push_back (make_pair (V[i], i));
    }
    sort (srt.begin (), srt.end ()); // sortam
    for (int i = 0, norm = 0; i < N; V[srt[i++].y] = norm) { // normalizam
        if (i > 0 && srt[i - 1].x != srt[i].x)
            norm += 1;
    }
    fprintf (fopen (FOU, "w"), "%lld", sol (U) - sol (L - 1));
}