Cod sursa(job #1782210)

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

using namespace std;

const int Nmax = 1048576 + 5;

int n, l, u, ind, a[Nmax], ap[Nmax];
vector < per > H[MOD + 5];

void Update(int x)
{
    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(int x)
{
    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 ()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);

    scanf("%d %d %d\n", &n, &l, &u);

    for (int i = 1; i <= n; ++i)
    {
        scanf("%d ", &a[i]);
        Update(a[i]);
    }

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

    printf("%d\n", sol(u) - sol (l - 1));

    return 0;
}