Cod sursa(job #965264)

Utilizator andrettiAndretti Naiden andretti Data 23 iunie 2013 21:33:47
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
#include<vector>
#define pb push_back
#define mp make_pair
#define mod 666013
#define maxn 1048581
using namespace std;
typedef unsigned int ui;

ui n,l,u,st1,st2,lst1,lst2,ind;
ui v[maxn],f1[maxn],f2[maxn];
vector < pair<ui,ui> > h[mod];
long long sol;

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

int search(ui x)
{
    int k=hash_imp(x);
    for(unsigned int i=0;i<h[k].size();i++)
     if(h[k][i].first==x)
      return h[k][i].second;
    h[k].pb(mp(x,++ind));
    return ind;
}

void del_1()
{
    lst1--; f1[v[st1]]--; st1++;
}

void del_2()
{
    while(f2[v[st2]]>1) { f2[v[st2]]--; st2++; }
    lst2--; f2[v[st2]]--; st2++;
}

void formalize()
{
    while(f1[v[st1]]>1) { f1[v[st1]]--; st1++; }
}

void cit()
{
    ui x;
    ui i;

    scanf("%u%u%u",&n,&l,&u);
     ui aux1,aux2;
    st1=st2=1; lst1=lst2=0;
    for(i=1;i<=n;i++)
    {
        scanf("%u",&x);

        v[i]=search(x);

        if(f1[v[i]]==0)
        {
            lst1++;
            if(f2[v[i]]==0) lst2++;
        }
        aux1=lst1; aux2=lst2;

        f1[v[i]]++; f2[v[i]]++;

        if(lst1==l) formalize();
        if(lst1>l) { del_1(); formalize(); }
        if(lst2>u) del_2();

        if(lst1>=l && lst2<=u) sol+=st1-st2+1; //printf("%u %u %u %u %u \n",i,st1,st2,aux1,aux2);}
    }
}

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

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