Cod sursa(job #993648)

Utilizator CosminnnChirica Cosmin Cosminnn Data 4 septembrie 2013 11:18:44
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMax = 1048586;
int N, L, U,st,dr1,dr2,c1,c2;
long long a[NMax], aux[NMax],sol;
int fr1[NMax],fr2[NMax];

inline void Read()
{
    freopen ("secv5.in","r",stdin);
    scanf("%d %d %d",&N,&L,&U);
    int i;
    for(i=1; i<=N; i++)
        scanf("%lld",&a[i]);
}

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;
        cout << a[i] << " ";
    }
}

inline void Solve()
{
    st=dr1=dr2=c1=c2=1;
    fr1[a[1]]=fr2[a[1]]=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++;
            }
        }
    }
    freopen("secv5.out","w",stdout);
    printf("%lld\n",sol);
}

int main()
{
    Read();
    Normalizare();
    Solve();

    return 0;
}