Cod sursa(job #1782249)

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

using namespace std;

const int Nmax = 1048576 + 5;

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

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) );
}

unsigned 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;
    }
}

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

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

    for (unsigned 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 += 1LL*(i - j + 1);
    }

    return ans;
}

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

    f >> n >> l >> u;

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

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

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

    return 0;
}