Cod sursa(job #993657)

Utilizator ionutmodoModoranu Ionut-Vlad ionutmodo Data 4 septembrie 2013 11:27:24
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMax = 1048586;
int N, L, U;
long long a[NMax], sol;
int fr1[NMax], fr2[NMax];
struct str
{
    int val, poz;
    bool operator <(const str &A) const
    {
        return val < A.val;
    }
}v[NMax];
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]);
        v[i].val = a[i];
        v[i].poz = i;
    }
}

inline void Normalizare()
{
    sort(v+1, v+N+1);
    int i;
    for(i=1; i<=N; i++)
        a[v[i].poz] = a[v[i-1].poz]+!(v[i].val == v[i-1].val);
}

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(++fr1[a[dr1]]==1)
                ++c1;
        }
        if(c2 <= U && dr2<N)
        {
            ++dr2;
            if(++fr2[a[dr2]]==1)
                ++c2;
        }
        else
            if(c1>=L && c1<=U+1)
            {
                sol+=dr2-dr1;
                if(c2 <= U)
                    sol++;
                if(--fr1[a[st]]==0)
                    --c1;
                if(--fr2[a[st]]==0)
                    --c2;
                st++;
            }
    }
}

inline void Afisare()
{
    freopen("secv5.out","w", stdout);
    printf("%lld\n", sol);
}

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