Cod sursa(job #1891593)

Utilizator GoogalAbabei Daniel Googal Data 24 februarie 2017 10:24:57
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <vector>
#include <memory.h>
#define MOD 666013
#define nmax (1<<20)+1

using namespace std;

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

long long n,u,l,v[nmax],nr,vf[nmax],rez[nmax];

vector < pair< long long, long long > >lista[MOD];

long long real(long long x)
{
    long long l=x%MOD;
    int i;
    for(i=0; i<lista[l].size(); i++)
        if(lista[l][i].first==x)
            return lista[l][i].second;
    return 0;
}

long long normalize(long long x)
{
    long long p=real(x);
    if(p)
        return p;
    else
    {
        nr++;
        lista[x%MOD].push_back(make_pair(x,nr));
        return nr;
    }
}

long long proces(long long x)
{
    long long sum=0,p=1,nr=0;
    int i;
    memset(vf,0,sizeof(vf));
    for(i=1; i<=n; i++)
    {
        vf[v[i]]++;
        if(vf[v[i]]==1)
        {
            nr++;
            while(nr>x)
            {
                vf[v[p]]--;
                if(!vf[v[p]])
                    nr--;
                p++;
            }
        }
        rez[i]=p;
        sum+=(i-rez[i]+1);
    }
    return sum;
}

int main()
{
    int i;
    fin>>n>>l>>u;
    for(i=1; i<=n; i++)
    {
        fin>>v[i];
        v[i]=normalize(v[i]);
    }
    fout<<proces(u)-proces(l-1);
    fin.close();
    fout.close();
    return 0;
}