Cod sursa(job #1784618)

Utilizator delia_99Delia Draghici delia_99 Data 20 octombrie 2016 11:55:32
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <vector>
#define MOD 666013
#define NMAX (1<<20)
using namespace std;

int l,r,n,i;
unsigned int v[NMAX+5];
vector <pair <unsigned int,int> > H[MOD+5];

void upd(unsigned int x)
{
    H[x%MOD].push_back(make_pair(x,0));
}

int addd(unsigned int x,int val)
{
    int cod=x%MOD,i,s=H[cod].size();
    for(i=0; i<s; ++i)
        if(H[cod][i].first==x)
        {
            H[cod][i].second+=val;
            return H[cod][i].second;
        }
}

void erasee(unsigned int x)
{
    int cod=x%MOD,i,s=H[cod].size();
    for(i=0; i<s; ++i)
        if(H[cod][i].first==x)
        {
            H[cod][i].second=0;
            return ;
        }

}

long long slv(int l)
{
    int i=1,j,crt=0;
    long long sol=0LL;
    for(j=1; j<=n; ++j)
    {
        if(addd(v[j],1)==1)
            ++crt;
        while(crt>l)
        {
            if(addd(v[i],-1)==0)
                --crt;
            ++i;
        }
        sol+=1LL*(j-i+1);
    }
    for(j=i; j<=n; ++j)
        erasee(v[j]);
    return sol;
}


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

    scanf("%d%d%d",&n,&l,&r);

    for(i=1; i<=n; ++i)
    {
        scanf("%u",&v[i]);
        upd(v[i]);
    }

    printf("%lld\n",slv(r)-slv(l-1));

    return 0;
}