Cod sursa(job #994133)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 4 septembrie 2013 23:31:59
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define Nmax (1<<20) + 2

using namespace std;

int n, l, u;
int a[Nmax];
int fr1[Nmax], fr2[Nmax];
int sol;
int aux[Nmax];

inline void Read()
{
    ifstream f ("secv5.in");
    f>>n>>l>>u;
    int i;
    for (i=1; i<=n; i++)
        f>>a[i];
    f.close();
}

inline void Normalizare()
{
    int i;
    for (i=1; i<=n; i++)
        aux[i] = a[i];
    sort(aux+1, aux+n+1);
    for (i=1; i<=n; i++)
        a[i] = lower_bound(aux+1, aux+n+1, a[i]) - aux;
}

inline void Solve()
{
    int st, dr1, dr2, c1, c2;
    st = dr1 = dr2 = c1 = c2 = 1;
    fr1[a[1]] = fr2[a[1]] = 1;

    while(dr1 <= n)
    {
        if(c1 < l)
        {
            dr1++;
            if (dr1<=n)
            {
                if(fr1[a[dr1]]==0)
                    c1++;
                fr1[a[dr1]]++;
            }
        }
        if(c2 <= u && dr2 < n)
        {
            dr2++;
            if(fr2[a[dr2]]==0)
                c2++;
            fr2[a[dr2]]++;
        }
        else
            if(c1 == l && c2 <= u+1 && c2 >= l)
            {
                sol+=dr2-dr1;
                if(c2 <= u)
                    sol++;
                if(--fr1[a[st]]==0)
                    c1--;
                if(--fr2[a[st]]==0)
                    c2--;
                st++;
            }
    }
}

inline void Write()
{
    ofstream g("secv5.out");
    g<<sol<<"\n";
    g.close();
}

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