Cod sursa(job #331457)

Utilizator DraStiKDragos Oprica DraStiK Data 14 iulie 2009 08:31:46
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>
#define HASH 1234561
#define DIM 1<<20+5

struct numar {unsigned int x,n;} a[DIM];
struct nod {unsigned int x,n;
            nod *urm;} *h[HASH];
unsigned int ap[DIM];
unsigned int n,l,u,m,nr,st;
long long unsigned nrt;

void add (unsigned int a,unsigned int b)
{
    nod *p;
    for (p=h[a]; p; p=p->urm)
        if (p->x==b)
            return ;
    p=new nod;
    p->x=b;
    p->n=++m;
    p->urm=h[a];
    h[a]=p;
}

void read ()
{
    unsigned int i;
    scanf ("%u%u%u",&n,&l,&u);
    for (i=1; i<=n; ++i)
    {
        scanf ("%u",&a[i].x);
        add (a[i].x%HASH,a[i].x);
    }
}

unsigned int find (unsigned int a,unsigned int b)
{
    nod *p;
    for (p=h[a]; p; p=p->urm)
        if (p->x==b)
            return p->n;
    return 0;
}

void norm ()
{
    unsigned int i;
    for (i=1; i<=n; ++i)
        a[i].n=find (a[i].x%HASH,a[i].x);
}

void clean ()
{
    unsigned int i;
    for (i=1; i<=m; ++i)
        ap[i]=0;
    nr=nrt=0;
    st=1;
}

long long unsigned solve (int p)
{
    unsigned int i;
    clean ();
    for (i=1; i<=n; ++i)
    {
        if (++ap[a[i].n]==1)
            ++nr;
        for ( ; nr>p; ++st)
            if (--ap[a[st].n]==0)
                --nr;
        nrt+=i-st+1;
    }
    return nrt;
}

int main ()
{
    freopen ("secv5.in","r",stdin);
    freopen ("secv5.out","w",stdout);
    read ();
    norm ();
    printf ("%llu",solve (u)-solve (--l));
    return 0;
}