Cod sursa(job #1252476)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 30 octombrie 2014 19:53:19
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <vector>
#include <algorithm>

#define M 666013
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define ui unsigned int

using namespace std;

const int NMAX = (1 << 20) + 5;
ui v[NMAX];

int n, l, u, d;

vector < pair <ui, int> > h[M];
vector < pair <ui, int> > :: iterator it;

void add (ui x)
{
    int ind = x % M;
    bool OK = false;

    for (it = h[ind].begin (); it != h[ind].end () && !OK; ++it)
        if (it -> f == x)
        {
            ++it -> s;
            OK = true;
        }

    if (!OK)
    {
        h[ind].pb (mp (x, 1));
        ++d;
    }
}

void del (ui x)
{
    int ind = x % M;
    for (it = h[ind].begin (); it != h[ind].end (); ++it)
        if (it -> f == x)
        {
            --it -> s;
            if (it -> s == 0) --d;
        }
}

long long scv (int lim)
{
    int a = 1, b = 1;
    long long rez = 0LL;
    d = 0;

    for (int i = 0; i < M; ++i)
        h[i].clear ();

    while (b <= n)
    {
        add (v[b]);

        while (d > lim)
        {
            del (v[a]);
            ++a;
        }

        rez += 1LL * (1LL * b - 1LL * a + 1LL);
        ++b;
    }

    return rez;
}

int main ()
{
    freopen ("secv5.in", "r", stdin);
    freopen ("secv5.out", "w", stdout);

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

    for (int i = 1; i <= n; ++i)
        scanf ("%u", &v[i]);

    long long nr = 1LL * (1LL* scv (u) - 1LL * scv (l - 1));
    printf ("%lld", nr);

    return 0;
}