Cod sursa(job #912203)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 12 martie 2013 10:17:49
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <cstring>
#include <vector>
#define f first
#define s second
#define MOD 666013
#define N 1050000
#define mp make_pair
#define pb push_back

using namespace std;

vector<pair<int, int> > H[MOD+10];
unsigned int sol, stk, L, i, j, aux[N], A[N], a[N], x, n, p, l, u;
bool ok;

void get_Hash(int lim)
{
    stk = 1; L = 0;
    for(i = 0; i < MOD; i++) H[i].clear();
    for(j = 1; j <= n; j++)
    {
        x = a[j];
        p = x % MOD;
        for(i = 0, ok = 1; i < H[p].size(); i++)
            if(H[p][i].f == x)
            {
                if(!H[p][i].s) L++;
                H[p][i].s++;
                ok = 0;
                break;
            }
        if(ok)
        {
            H[p].pb(mp(x, 1));
            L++;
        }
        while(L > lim)
        {
            x = a[stk];
            p = x % MOD;
            for(i = 0; i < H[p].size(); i++)
                if(H[p][i].f == x)
                {
                    H[p][i].s--;
                    if(!H[p][i].s) L--;
                    break;
                }
            stk++;
        }
        aux[j] = stk;
    }
}
int main()
{
    ifstream fi("secv5.in");
    ofstream fo("secv5.out");
    fi >> n >> l >> u;
    for(i = 1; i <= n; i++) fi >> a[i];
    get_Hash(u);
    memcpy(A, aux, sizeof(aux));
    get_Hash(l-1);
    for(i = 1; i <= n; i++) sol += aux[i] - A[i];
    fo << sol << "\n";
    return 0;
}