Cod sursa(job #1015000)

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

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

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

inline long long rezolvare(int p) {
    long long sol = 0; 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 += dr-st;
            if (--aparitii[a[st++]] == 0) apct--;
        }
        while (dr <= n && apct <= p) {
            dr++;
            if (++aparitii[a[dr]] == 1) apct++;
        }
    }
    while (st <= n) {
        sol += dr-st;
        st++;
    }
    return sol;
}

int main() {
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d %d %d",&n,&l,&u);
    for (int i=1; i<=n; ++i) {
        scanf("%d",&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]++;
    }
    printf("%d\n",rezolvare(u) - rezolvare(l-1));
    return 0;
}