Cod sursa(job #993631)

Utilizator LauraAb.Laura Abef LauraAb. Data 4 septembrie 2013 10:58:33
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <cstdio>
#include <algorithm>

using namespace std;

int n,p,u;
int a[1050000];
int fr1[1050000],fr2[1050000];
long long sol;
struct str
{
    int val, poz;
};
str v[1050000];

inline bool cmp(const str A, const str B)
{
    return A.val < B.val;
}

void Citire()
{
    freopen ("secv5.in", "r", stdin);
    int i;
    scanf ("%d %d %d", &n, &p, &u);
    for(i=1;i<=n;i++)
    {
        scanf("%d", &a[i]);
        v[i].val = a[i];
        v[i].poz = i;
    }
}

inline void Normalizare()
{
    sort(v+1,v+n+1, cmp);
    for(int i = 1;i <= n; ++i)
        a[v[i].poz] = a[v[i-1].poz]+!(v[i].val==v[i-1].val);
}


inline void Solve()
{
    int st=1,dr1=1,dr2=1,cnt1=1,cnt2=1;
    fr1[a[1]]=fr2[a[1]]=1;
    while(dr1<=n)
    {
        if(cnt1<p)
        {
            ++dr1;
            if(++fr1[a[dr1]]==1)
                ++cnt1;
        }
        if(cnt2<=u && dr2<n)
        {
            ++dr2;
            if(++fr2[a[dr2]]==1)
                ++cnt2;
        }
        else
            if(cnt1>=p && cnt2<=u+1)
            {
                sol+=dr2-dr1;
                if(cnt2<=u)
                    sol++;
                if(--fr1[a[st]]==0)
                    --cnt1;
                if(--fr2[a[st]]==0)
                    --cnt2;
                ++st;
            }
    }
}

inline void Write()
{
    freopen ("secv5.out", "w", stdout);
    printf("%lld\n", sol);
}


int main()
{
    Citire();
    Normalizare();
    Solve();
    Write();
    return 0;
}