Cod sursa(job #1782232)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 17 octombrie 2016 21:26:20
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
# include <bits/stdc++.h>
# define per pair <unsigned int, int>
# define MOD 666013

using namespace std;

const int Nmax = 1048576 + 5;

unsigned int n, l, u, ind, a[Nmax], ap[Nmax];

vector < per > H[MOD + 5];

void Update(unsigned int x)
{
    unsigned int xx = x % MOD;
    x %= MOD;

    vector < per >::iterator it;

    for (it = H[x].begin(); it != H[x].end(); ++it)
    {
        per y = *it;
        if (y.first == xx) return;
    }

    H[x].push_back( make_pair(xx, ++ind) );
}

int Find(unsigned int x)
{
    unsigned int xx = x % MOD;
    x %= MOD;

    vector < per >:: iterator it;

    for (it = H[x].begin(); it != H[x].end(); ++it)
    {
        per y = *it;
        if (y.first == xx) return y.second;
    }
}

int sol(int length)
{
    int j = 1, ans = 0, nr = 0;

    memset(ap, 0, sizeof(ap));

    for (int i = 1; i <= n; ++i)
    {
        ap[a[i]]++;

        if (ap[a[i]] == 1) ++nr;

        while (nr > length)
        {
            ap[a[j]]--;
            if (!ap[a[j]]) --nr;
            ++j;
        }
        ans += (i - j + 1);
    }

    return ans;
}

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

    f >> n >> l >> u;

    for (int i = 1; i <= n; ++i)
    {
        f >> a[i];
        Update(a[i]);
    }

    for (int i = 1; i <= n; ++i)
        a[i] = Find(a[i]);

   g << sol(u) - sol(l - 1) << '\n';

    return 0;
}