Cod sursa(job #1189096)

Utilizator heracleRadu Muntean heracle Data 21 mai 2014 12:18:33
Problema Secventa 5 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <cstdio>

FILE* in;
FILE* out;

unsigned int n,s,d;

const int Q=(1<<22)+1;

const int KEY=Q;

unsigned int v[Q];



unsigned int nrM,nrm;

unsigned int lstmax[KEY],valmax[Q],urmmax[Q],nrmax;


void inline addmax(int x)
{
    int r=x&(KEY-1);
    valmax[++nrmax]=x;
    urmmax[nrmax]=lstmax[r];
    lstmax[r]=nrmax;
}

bool inline findmax(int x)
{
    int p=lstmax[x&(KEY-1)];
    while(p!=0 && valmax[p]!=x)
        p=urmmax[p];
    return p!=0;
}

void inline stergemax(int x)
{
    int r=x&(KEY-1),p;
    if(x==valmax[lstmax[r]])
    {
        lstmax[r]=urmmax[lstmax[r] ];
        return;
    }
    p=lstmax[r];
    while(urmmax[p]!=0 && valmax[urmmax[p]]!=x)
        p=urmmax[p];
    if(valmax[urmmax[p]]==x)
        urmmax[p]=urmmax[urmmax[p]];
}





unsigned int lstmin[KEY],valmin[Q],urmmin[Q],nrmin;


void inline addmin(int x)
{
    int r=x&(KEY-1);
    valmin[++nrmin]=x;
    urmmin[nrmin]=lstmin[r];
    lstmin[r]=nrmin;
}

bool inline findmin(int x)
{
    int p=lstmin[x&(KEY-1)];
    while(p!=0 && valmin[p]!=x)
        p=urmmin[p];
    return p!=0;
}

void inline stergemin(int x)
{
    int r=x&(KEY-1),p;
    if(x==valmin[lstmin[r]])
    {
        lstmin[r]=urmmin[lstmin[r] ];
        return;
    }
    p=lstmin[r];
    while(urmmin[p]!=0 && valmin[urmmin[p]]!=x)
        p=urmmin[p];
    if(valmin[urmmin[p]]==x)
        urmmin[p]=urmmin[urmmin[p]];
}







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

    fscanf(in,"%u%u%u",&n,&s,&d);

    int i=1;
    int stmin=1,stmax=1;
    for( ; nrm<s && i<=n; i++)
    {
        fscanf(in,"%u",&v[i]);

        if(findmax(v[i])==0)
        {
            nrM++;
            nrm++;
        }

        addmin(v[i]);
        addmax(v[i]);
    }


    while(true)
    {
        stergemin(v[stmin]);
        if(findmin(v[stmin])==0)
        {
            addmin(v[stmin]);
            break;
        }
        stmin++;
    }


    if(nrm<s)
    {
        fprintf(out,"0");
        return 0;
    }

    long long rez=stmin-stmax+1;



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

        if(findmax(v[i])==0)
        {
            nrM++;
            while(nrM==d+1)
            {
                stergemax(v[stmax]);
                stmax++;

                if(findmax(v[stmax-1])==0)
                    nrM--;

            }
        }
        addmax(v[i]);

        if(findmin(v[i])==0)
            nrm++;
        addmin(v[i]);

        while(nrm>s-1)
        {
            stergemin(v[stmin]);
            stmin++;
            if(findmin(v[stmin-1])==0)
                nrm--;


        }
        nrm++;
        stmin--;
        addmin(stmin);

        rez+=stmin-stmax+1;
    }

    fprintf(out,"%lld",rez);

    return 0;
}