Cod sursa(job #1786944)

Utilizator GeanaVladGeana Vlad GeanaVlad Data 23 octombrie 2016 21:13:37
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include<vector>
#include<cstdio>
#define MOD 666013
using namespace std;
long long n,a,b,i,x,v[1200010],nr,vf[1200000],L[1200010];
vector<pair<long long,long long> >h[MOD];
inline long long exista(long long x)
{
    long long m=x%MOD;
    int sz=h[m].size();
    for(long long i=0;i<sz;i++)
        if(h[m][i].first==x)
            return h[m][i].second;
    return 0;
}
inline long long normalizare(long long x)
{
    long long p=exista(x);
    if(p)
        return p;
    else
    {
        nr++;
        h[x%MOD].push_back(make_pair(x,nr));
        return nr;
    }
}
inline long long procedura(long long a)
{
    long long i;
    for(i=1;i<=n;i++)
        vf[v[i]]=0;
    long long p=1,nr=0,sum=0;
    for(i=1;i<=n;i++)
    {
        vf[v[i]]++;
        if(vf[v[i]]==1)
        {
            nr++;
            while(nr>a)
            {
                vf[v[p]]--;
                if(vf[v[p]]==0)
                    nr--;
                p++;
            }
        }
        L[i]=p;
        sum=sum+(i-L[i]+1);
    }
    return sum;
}
int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    cin>>n>>a>>b;
    for(i=1;i<=n;i++)
    {
        cin>>x;
        v[i]=normalizare(x);
    }
    cout<<procedura(b)-procedura(a-1);
}