Cod sursa(job #965180)

Utilizator andrettiAndretti Naiden andretti Data 23 iunie 2013 17:13:02
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include<stdio.h>
#include<vector>
#define pb push_back
#define mp make_pair
#define mod 66601
using namespace std;

unsigned int n,l,u,nr,sol,st1,st2,ind1,ind2,lst2,lst1;
unsigned int v[(1<<20)+5];
vector < pair<unsigned int,unsigned int> > l1[mod],l2[mod];

int hash_imp(unsigned int k)
{
    return k%mod;
}

void add1(unsigned int x)
{
    int k=hash_imp(x);

    for(unsigned int i=0;i<l1[k].size();i++)
     if(l1[k][i].first==x)
     {
         l1[k][i].second++;
         break;
     }
     l1[k].pb(mp(x,1));
}

void add2(unsigned int x)
{
    int k=hash_imp(x);

    for(unsigned int i=0;i<l2[k].size();i++)
     if(l2[k][i].first==x)
     {
         l2[k][i].second++;
         break;
     }
     l2[k].pb(mp(x,1));
}

int search1(unsigned int x)
{
    int k=hash_imp(x);

    ind1=ind2=-1;
    for(unsigned int i=0;i<l1[k].size();i++)
     if(l1[k][i].first==x)
     {
         if(l1[k][i].second>0) { ind1=k; ind2=i; return l1[k][i].second; }
         return 0;
     }
    return 0;
}

int search2(unsigned int x)
{
    int k=hash_imp(x);

    ind1=ind2=-1;
    for(unsigned int i=0;i<l2[k].size();i++)
     if(l2[k][i].first==x)
     {
         if(l2[k][i].second>0) { ind1=k; ind2=i; return l2[k][i].second; }
         return 0;
     }
    return 0;
}


void del1()
{
    while(search1(v[st1])>1) {st1++; l1[ind1][ind2].second--;}
     if(lst1>l) { st1++; l1[ind1][ind2].second--; }
}

void del2()
{
    while(search2(v[st2])>1) {st2++; l2[ind1][ind2].second--;}
     if(lst2>u) st2++; { l2[ind1][ind2].second--; }
}

void cit()
{
    unsigned int x;
    unsigned int i;

    scanf("%u%u%u",&n,&l,&u);

    st1=st2=1; lst1=lst2=1;
    scanf("%u",&x); add1(x); add2(x); v[1]=x;

    for(i=2;i<=n;i++)
    {
        scanf("%u",&x);

        if(search1(x)==0)
        {
            lst1++;
            if(lst1>=l) del1();
            if(search2(x)==0)
            {
                lst2++;
                if(lst2>u) del2();
            }
        }
        add1(x); add2(x); v[i]=x;
        if(lst2>=l) sol+=st1-st2+1;
    }
}

int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);

    cit();
    printf("%u",sol);
    fclose(stdin);
    fclose(stdout);
    return 0;
}