Cod sursa(job #1766071)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 27 septembrie 2016 13:33:13
Problema Secventa 5 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>

using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

#define f first
#define s second
#define prim 666667
#define nmax 1100000

vector < pair <long long,long long> > h[prim];
long long v[nmax];
long long d[nmax];
long long fr[nmax];
long long n,k,i,l,u,x,number,nr,ans;

void push(long long x,long long k)
{
     h[x%prim].push_back(make_pair(x,k));
}

long long exists(long long x)
{
    long long mod = x %prim;
    for(long long i=0; i<h[mod].size(); ++i)
        if(h[mod][i].f==x)
            return h[mod][i].s;
    return -1;
}

int main()
{
    fin>>n>>l>>u;
    for(i=1; i<=n; ++i)
    {
        fin>>x;
        number = exists(x);
        if(number > 0)
        {
            v[i]=number;
        }
        else
        {
            ++k;
            push(x,k);
            v[i]=k;
        }
    }
    long long s=1;
    for(i=1; i<=n; ++i)
    {
        fr[v[i]]++;
        if(fr[v[i]]==1)
        {
            ++nr;
            while(nr>l-1)
            {
                fr[v[s]]--;
                if(fr[v[s]]==0)
                    --nr;
                ++s;
            }
        }
        d[i]=s;
    }
    s=1;
    for(i=1; i<=n; ++i)
    {
        fr[v[i]]++;
        if(fr[v[i]]==1)
        {
            ++nr;
            while(nr>u)
            {
                fr[v[s]]--;
                if(fr[v[s]]==0)
                    --nr;
                ++s;
            }
        }
        ans+=(d[i]-s);
    }
    fout<<ans;
}