Cod sursa(job #1015033)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 23 octombrie 2013 19:51:57
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <algorithm>
#define nmax (1<<20)+2
using namespace std;

struct element {
    unsigned int val;
    unsigned int pos;
};
element v[nmax];
unsigned int aparitii[nmax];
unsigned int n, l, u;
unsigned int a[nmax];

bool cmp(element a,element b) {
    return a.val < b.val;
}

inline unsigned long long rezolvare(int p) {
    unsigned long long sol = 0; unsigned int st=1, dr=0, apct=0;
    for (int i=0; i<nmax; i++) aparitii[i] = 0;
    while (dr <= n && apct<=p) if (++aparitii[a[++dr]] == 1) apct++;
    sol += dr - st;
    if (--aparitii[a[st]] == 0) apct--;
    st++;
    while (dr <= n) {
        while (apct > p) {
            sol += (unsigned long long)(dr-st);
            if (--aparitii[a[st++]] == 0) apct--;
        }
        while (dr <= n && apct <= p) {
            dr++;
            if (++aparitii[a[dr]] == 1) apct++;
        }
    }
    while (st <= n) {
        sol += (unsigned long long)(dr-st);
        st++;
    }
    return sol;
}

int main() {
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%u %u %u",&n,&l,&u);
    for (int i=1; i<=n; ++i) {
        scanf("%u",&a[i]);
        v[i].val = a[i];
        v[i].pos = i;
    }
    sort(v+1,v+n+1,cmp);
    for (int i = 1; i<=n; i++) {
        a[v[i].pos] = a[v[i-1].pos];
        if (v[i].val != v[i-1].val) a[v[i].pos]++;
    }
    unsigned long long x = rezolvare(u);
    unsigned long long y = rezolvare(l-1);
    printf("%lld\n",x-y);
    return 0;
}