Cod sursa(job #1315868)

Utilizator ThomasFMI Suditu Thomas Thomas Data 13 ianuarie 2015 11:17:51
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <list>
using namespace std;

#define NMax 1048580
#define MOD 666013

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

struct Hash
{
    unsigned int nr,ap;
}q;

int n,L,U;
unsigned int v[NMax];
list<Hash> H[MOD];
list<Hash>::iterator it;
int Hsize;

void Hadd(int x)
{
    int r = x%MOD;
    for(it = H[r].begin(); it != H[r].end(); ++it)
        if((*it).nr == x) {(*it).ap++; return;}

    if(it == H[r].end())
    {
        q.nr = x;
        q.ap = 1;
        H[r].insert(it,q);
        ++Hsize;
    }
}

void Hremove(int x)
{
    int r = x%MOD;
    for(it = H[r].begin(); it != H[r].end(); ++it)
        if((*it).nr == x) break;

    if((*it).ap == 1)
    {
        H[r].erase(it);
        --Hsize;
    }
    else (*it).ap--;
}

bool ok = false;
unsigned long long secv(int x)
{
    unsigned long long sol = 0;
    int j = 1;
    for(int i=1;i<=n;++i)
    {
        Hadd(v[i]);
        while(x < Hsize) Hremove(v[j++]);
        sol += i-j+1;
    }

    if(ok == false)
    {
        ok = true;
        Hsize = 0;
        for(int i=0;i<MOD;++i) H[i].clear();
    }

    return sol;
}

int main()
{
    f>>n>>L>>U;
    for(int i=1;i<=n;++i) f>>v[i];

    g<<secv(U)-secv(L-1)<<"\n";

    f.close();
    g.close();
    return 0;
}