Cod sursa(job #391685)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 6 februarie 2010 02:38:06
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define maxN    1400000

int N, M, L, U, a[maxN], v[maxN], l[maxN], fol[maxN];

int sol (int x) {
    int s = 1, i, nr = 1;

    l[1] = 1;
    memset(fol, 0, sizeof(fol));
    fol[v[1]] = 1;

    for (i = 2; i <= N; ++ i) {
        if (fol[v[i]] == 0)
            nr ++;
        fol[v[i]] ++;
        l[i] = l[i - 1];

        while (nr > x) {
            fol[v[l[i]]] --;
            if (fol[v[l[i]]] == 0) nr --;
            l[i] ++;
        }
        s += i - l[i] + 1;
    //    fprintf(stderr, "i = %d l[i] = %d nr = %d v[i] = %d fol[v[i]] = %d\n", i, l[i], nr, v[i], fol[v[i]]);
    }
//    printf("Sol = %d\n", s);
    return s;
}

int main () {
    int i, j, step, s;

    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);

    scanf("%d%d%d", &N, &L, &U);

    for (i = 1; i <= N; ++ i) {
        scanf("%d", v + i);
        a[i] = v[i];
    }

    sort(a + 1, a + N + 1);
    M = unique(a + 1, a + N + 1) - a - 1;

    for (step = 1; step <= M; step <<= 1);

    for (i = 1; i <= N; ++ i) {
        for (s = step, j = 1; s; s >>= 1)
            if (j + s <= M && a[j + s] <= v[i])
                j += s;
        v[i] = j;
    }

    printf("%d\n", sol(U) - sol(L - 1));
}