Cod sursa(job #1782130)

Utilizator antracodRadu Teodor antracod Data 17 octombrie 2016 20:03:55
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

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

const int NMAX = 1048581;
const int prim = 666013;

vector <pair <int,int> > H[prim];
long long int v[NMAX];
unsigned sol[NMAX];
long long int n,l,u;
long long int normaliz=0;
void AddToHash(unsigned x)
{
    int k=x%prim;
    for(int i=0; i<H[k].size(); i++)
    {
        if(H[k][i].first==x)
        {
            return;
        }
    }
    normaliz++;
    H[k].push_back(make_pair(x,normaliz));
}

long long int SearchHash(unsigned x)
{
    int k=x%prim;
    for(int i=0; i<H[k].size(); i++)
    {
        if(H[k][i].first==x)
        {
            return H[k][i].second;
        }
    }
}

long long seq(int Len)
{
    if(Len==0)
        return 0;
    long long ans=0;
    long long int d=0,j=1;
    memset(sol,0,sizeof sol); /// Reset sol to 0

    for(int i=1; i<=n; i++)
    {
        sol[v[i]]++;
        if(sol[v[i]]==1)
        {
            d++;
        }
        while(d>Len)
        {
            sol[v[j]]--;
            if(sol[v[j]]==0)
                {
                    d--;
                }
                j++;
        }
        ans+=i-j+1;
    }
    return ans;
}

int main()
{
    in>>n>>l>>u;
    for(int i=1; i<=n; i++)
    {
        in>>v[i];
        AddToHash(v[i]);
    }
    for(int i=1; i<=n; i++)
    {
        v[i]=SearchHash(v[i]);
    }

    out<<seq(u)-seq(l-1);
}