Cod sursa(job #1174325)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 22 aprilie 2014 15:55:09
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <algorithm>

using namespace std;
struct qq
{
    unsigned int p, x;
}w[1100005];
unsigned int n, st, q, d, dr, i, v[1100005], a[1100005];
long long x, y;
bool compp(qq a, qq b)
{
    return a.x<b.x;
}
int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    scanf("%u%u%u", &n, &st, &dr);
    st--;
    for(i=1;i<=n;i++)
    {
        scanf("%u", &w[i].x);
        w[i].p=i;
    }
    sort(w+1,w+n+1,compp);
    v[w[1].p]=1;
    for(i=2;i<=n;i++)
        if(w[i].x==w[i-1].x) v[w[i].p]=v[w[i-1].p];
        else v[w[i].p]=v[w[i-1].p]+1;
    q=1;
    d=1;
    a[v[1]]=1;
    for(i=1;i<=n;i++)
    {
        while(d<=st&&q<=n)
        {
            q++;
            a[v[q]]++;
            if(a[v[q]]==1)
                d++;
        }
        a[v[q]]--;
        d--;
        q--;
        x=x+q-i+1;

        a[v[i]]--;
        if(a[v[i]]==0) d--;
    }

    q=1;
    d=1;
    a[v[1]]=1;
    for(i=1;i<=n;i++)
    {
        while(d<=dr&&q<=n)
        {
            q++;
            a[v[q]]++;
            if(a[v[q]]==1)
                d++;
        }
        a[v[q]]--;
        d--;
        q--;
        y=y+q-i+1;

        a[v[i]]--;
        if(a[v[i]]==0) d--;
    }
    printf("%lld", y-x);
    return 0;
}