Cod sursa(job #993269)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 3 septembrie 2013 16:12:05
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <algorithm>
#define Nmax 1048586
#define In "secv5.in"
#define Out "secv5.out"

using namespace std;

int fr1[Nmax],fr2[Nmax], a[Nmax],n, p, sol, q, v[Nmax];

inline void Read()
{
    ifstream f(In);
    f>>n>>p>>q;
    int i;
    for(i = 1;i <= n; ++i)
    {
        f >> v[i];
        a[i] = v[i];
    }
    f.close();
}

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
inline void Normalizare()
{
    qsort(v+1,n,sizeof(int),compare);
    for(int i = 1;i <= n; ++i)
        a[i] = upper_bound(v+1,v+n+1,a[i])-v-1;
}
ofstream g(Out);
inline void Solve()
{
    int st = 1,dr1 = 1,dr2 = 1,cnt1 = 1,cnt2 = 1;
    fr1[a[1]]++;
    fr2[a[1]]++;
    while(dr1 <= n)
    {
        if(cnt1 < p)
        {
            ++dr1;
            if(++fr1[a[dr1]]==1)
                ++cnt1;
        }
        if(cnt2 <= q && dr2<=n)
        {
            ++dr2;
            if(++fr2[a[dr2]]==1)
                ++cnt2;
        }
        else
        {
            if(cnt1>=p)
            {
                sol += dr2-dr1;
                if(cnt2<=2)
                    ++sol;
                if(--fr1[a[st]]==0)
                    --cnt1;
                if(--fr2[a[st]]==0)
                    --cnt2;
                st++;
            }
        }
    }
    if(cnt1== p && cnt2==q+1)
        sol += dr2-dr1;

}

inline void Write()
{

    g<<sol-1<<"\n";
    g.close();
}

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