Cod sursa(job #994132)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 4 septembrie 2013 23:31:37
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.25 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()
{
	Normalizare();
    int st, dr1, dr2;
    dr1 = dr2 = 0;
    st = 0;
    int c1, c2;
    c1 = c2 = 0;
    bool gata;
    while (dr2 <= n)
    {
        dr1++, dr2++;
		if (dr2 <= n)
		{
			if (fr1[a[dr1]] == 0)
				c1++;
			if (fr2[a[dr2]] == 0)
				c2++;
			fr1[a[dr1]]++;
			fr2[a[dr2]]++;
		}
        if (c1 == l)
        {
            gata = false;
            while (c2 <= u && dr2 <= n)
            {
                dr2++;
                if (dr2 <= n)
                {
                    if (fr2[a[dr2]] == 0)
                        c2++;
                    fr2[a[dr2]]++;
                }
            }
            if (c2 == u+1)
            {
                fr2[a[dr2]]--;
                dr2--;
                c2--;
            }
            else
                dr2--;


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

                if (c2<=u && dr2<=n)
                {
                    while (c2 <= u && dr2 <= n)
                    {
                        dr2++;
                        if (dr2<=n)
                        {
                            if (fr2[a[dr2]] == 0)
                                c2++;
                            fr2[a[dr2]]++;
                        }
                    }
                    if (c2 == u+1)
                    {
                        fr2[a[dr2]]--;
                        dr2--;
                        c2--;
                    }
                    else
                        dr2--;
                }

                while (c1<l && dr1!=dr2)
                {
                    dr1++;
                    if (fr1[a[dr1]] == 0)
                        c1++;
                    fr1[a[dr1]]++;
                }
            }

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

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

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