Cod sursa(job #9536)

Utilizator astronomyAirinei Adrian astronomy Data 27 ianuarie 2007 16:05:34
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 2.64 kb
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;

#define MAX_N ((1 << 20)+16)

typedef long long llong;

int N, U, L, Ind, Nr_unu[MAX_N], Nr_doi[MAX_N];

unsigned X[MAX_N], V[MAX_N];

llong res;

int get_pos(unsigned x)
{
    int st = 1, dr = Ind, m, r;
    while(st <= dr)
    {
        m = (st+dr) >> 1;
        if(V[m] <= x)
            r = m, st = m+1;
        else
            dr = m-1;
    }
    return r;
}

void solve(void)
{
    int i, p, q, t, cnt_unu = 0, cnt_doi;
    unsigned x, v;

    p = q = 1, cnt_unu = cnt_doi = 1, t = get_pos(X[1]);
    Nr_unu[t]++, Nr_doi[t]++;

    if(L == 1)
        res++;

    for(i = 2; i <= N; i++)
    {
        x = X[i], t = get_pos(x);
        if(Nr_unu[t] == 0)
        {
            cnt_unu++;
            Nr_unu[t]++;
            if(cnt_unu == L)
            {
                while( Nr_unu[t = get_pos(X[p])] >= 2 )
                    Nr_unu[t]--, p++;
            }
            if(cnt_unu > L)
            {
                while(p < i)
                {
                    Nr_unu[t = get_pos(X[p++])]--;
                    if(Nr_unu[t] == 0)
                        break ;
                }
            }
        }
        else
        {
            Nr_unu[t]++;
            if(cnt_unu >= L)
                while( Nr_unu[t = get_pos(X[p])] >= 2 )
                    Nr_unu[t]--, p++;
        }
        t = get_pos(x);
        if(Nr_doi[t] == 0)
        {
            cnt_doi++;
            Nr_doi[t]++;
            if(cnt_doi > U)
            {
                while(q < i)
                {
                    Nr_doi[t = get_pos(X[q++])]--;
                    if(Nr_doi[t] == 0)
                        break ;
                }
            }
        }
        else
            Nr_doi[t]++;

        if(cnt_unu >= L)
            res += (llong)(p-q+1);
    }
}

void read_data(void)
{
    int i, ind;
    unsigned x;
    char sir[1024];
    
    scanf("%d %d %d\n", &N, &L, &U);

    for(i = 1; i <= N; i++)
    {
        fgets(sir, 1024, stdin), ind = 0, x = 0;
        for(; sir[ind] >= '0' && sir[ind] <= '9'; ind++)
            x = x*10+(unsigned)(sir[ind]-48);
        X[i] = x, V[i] = x;
    }

    sort(V+1, V+N+1);

    for(ind = 1, i = 2; i <= N; i++)
     if(V[i] != V[ind])
        V[++ind] = V[i];

    Ind = ind;
}

void write_data(void)
{
    printf("%lld\n", res);
}

int main(void)
{
    freopen("secv5.in", "rt", stdin);
    freopen("secv5.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}