Cod sursa(job #993612)

Utilizator simaghitaSima Gheorghe Eugen simaghita Data 4 septembrie 2013 10:40:45
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include<fstream>
#include<algorithm>
#define Nmax (1<<20) + 2
using namespace std;
ofstream fout("secv5.out");
int a[Nmax],fr1[Nmax],fr2[Nmax],c1,c2,n,l,u,sol;

int  aux[Nmax];
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;

}
void Citire()
{
    ifstream fin("secv5.in");
    fin>>n>>l>>u;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    fin.close();
}
void Rezolvare()
{
    int st, dr1,dr2;
    fr1[a[1]]=1;
    fr2[a[1]]=1;

    st=dr1=dr2=c1=c2=1;

    while(dr1<=n)
    {
        if(c1<l)
        {
            dr1++;
            if(++fr1[a[dr1]]==1)
                c1++;

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

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

    }
}

int main()
{

    Citire();
    Normalizare();
    Rezolvare();
    fout<<sol<<"\n";
    fout.close();
    return 0;
}