Cod sursa(job #1236487)

Utilizator alexpascadiAlexandru Pascadi alexpascadi Data 1 octombrie 2014 23:45:22
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <stdio.h>

using namespace std;

const int R=666013;
const int N=(1<<20) +1;

int lst[2][R],val[2][N],urm[2][N];
int v[N],nr[2];
int ind;

void adauga (int x)
{
    int tip=x%R;
    nr[ind]++;
    val[ind][nr[ind]]=x;
    urm[ind][nr[ind]]=lst[ind][tip];
    lst[ind][tip]=nr[ind];
}

void sterge (int x)
{
    int tip=x%R,p;
    p=lst[ind][tip];

    if(x==val[ind][p])
        lst[ind][tip]=urm[ind][p];

    while(urm[ind][p]!=0)
    {
        if(x==val[ind][urm[ind][p]])
        {
            urm[ind][p]=urm[ind][urm[ind][p]];
            return;
        }
        p=urm[ind][p];
    }
}

bool exista (int x)
{
    int tip=x%R,p;
    p=lst[ind][tip];
    while(p!=0)
    {
        if(x==val[ind][p])
            return 1;
        p=urm[ind][p];
    }
    return 0;
}

int main ()
{
    FILE *in,*out;
    in=fopen("secv5.in","r");
    out=fopen("secv5.out","w");

    int i,j,k,n,L,U,dj,dk,ns;

    fscanf(in,"%d%d%d",&n,&L,&U);

    for(i=0;i<n;i++)
        fscanf(in,"%d",&v[i]);

    j=k=0;
    dj=dk=0;
    ns=0;
    for(i=0;i<n;i++)
    {
        ind=0;
        //actualizeaza j si dj
        while(j<n && dj<L)
        {
            if(!exista(v[j]))
                dj++;
            adauga(v[j]);
            //printf("adaug %d\n",v[j]);
            j++;
        }

        ind=1;
        //actualizeaza k si dk
        if(k<n && dk<=U)
        {
            while(k<n && dk<=U)
            {
                //printf("v[k]=%d; ",v[k]);
                if(!exista(v[k]))
                {
                    //printf("NU EXISTA!\n");
                    dk++;
                }
                adauga(v[k]);
                k++;
            }
            if(dk==U+1)
                k--;
        }

        //printf("i=%d, j=%d, k=%d\n",i,j,k);
        if(dj==L)
            ns+=k-j+1;

        //elimina elementul de la inceput
        ind=0;
        //printf("sterg %d din 0\n",v[i]);
        sterge(v[i]);
        if(!exista(v[i]))
        {
            //printf("%d nu mai exista in 0!\n",v[i]);
            dj--;
        }

        ind=1;
        //printf("sterg %d din 1\n",v[i]);
        sterge(v[i]);
        if(!exista(v[i]))
        {
            //printf("%d nu mai exista in 1!\n",v[i]);
            dk--;
        }
        //printf("ns=%d\n",ns);
    }

    fprintf(out,"%d\n",ns);
}