Cod sursa(job #9207)

Utilizator dominoMircea Pasoi domino Data 27 ianuarie 2007 02:06:01
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

using namespace std;

#define MAX_N 1<<20
#define FIN "secv5.in"
#define FOUT "secv5.out"

int N, L, R, cnt1[MAX_N], cnt2[MAX_N], nv;
unsigned A[MAX_N], V[MAX_N]; char buf[16];
long long Res;

inline unsigned read_int(void)
{
    unsigned n = 0;
    char *p;

    fgets(buf, sizeof(buf), stdin);
    for (p = buf; *p >= '0' && *p <= '9'; p++)
        n = n*10 + *p-'0';
    return n;
}

int main(void)
{
    int i, l1, l2, n1, n2;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d %d\n", &N, &L, &R);
    for (i = 0; i < N; i++)
        A[i] = V[i] = read_int();

    sort(V, V+nv);
    nv = unique(V, V+nv)-V;
    for (i = 0; i < N; i++)
        A[i] = lower_bound(V, V+nv, A[i])-V;

    for (i = l1 = l2 = n1 = n2 = 0; i < N; i++)
    {
        if (++cnt1[A[i]] == 1) n1++;
        for (; n1 > R && l1 <= i; l1++)
            if (--cnt1[A[l1]] == 0) n1--;

        if (++cnt2[A[i]] == 1) n2++;
        for (; n2 >= L && l2 <= i; l2++)
            if (--cnt2[A[l2]] == 0) n2--;

        Res += l2-l1;
    }

    printf("%lld\n", Res);

    return 0;
}