Cod sursa(job #1766069)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 27 septembrie 2016 13:30:06
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 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 <int,int> > h[prim];
int v[nmax];
int d[nmax];
int fr[nmax];
int n,k,i,l,u,x,number,nr,ans;

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

int exists(int x)
{
    int mod = x %prim;
    for(int 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;
        }
    }
    int 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;
}