Cod sursa(job #1609075)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 22 februarie 2016 16:37:53
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

vector <unsigned> aux;

//15:26
const int NMAX = (1 << 20) + 5;
int n;
unsigned v[NMAX];

int frecv[NMAX];

long long int det_ans(int bound) {
    if (!bound)
        return 0;
    memset(frecv, 0, sizeof frecv);

    long long int ans = 0;

    int st = 1;
    int dist = 0;

    for (int i = 1; i <= n; ++ i) {
        ++ frecv[v[i]];
        if (frecv[v[i]] == 1)
            ++ dist;

        while (dist > bound && st <= i) {
            frecv[v[st]] --;
            if (!frecv[v[st ++]])
                -- dist;
        }


        ans += (i - st + 1);
    }

    return ans;
}

int main()
{
    ifstream cin("secv5.in");
    ofstream cout("secv5.out");

    int l, u;
    cin >> n >> l >> u;

    for (int i = 1; i <= n; ++ i) {
        cin >> v[i];
        aux.push_back(v[i]);
    }

    sort(aux.begin(), aux.end());
    aux.resize(unique(aux.begin(), aux.end()) - aux.begin());

    for (int i = 1; i <= n; ++ i)
        v[i] = lower_bound(aux.begin(), aux.end(), v[i]) - aux.begin() + 1;

    cout << det_ans(u) - det_ans(l - 1) << '\n';

    cin.close();
    cout.close();
    return 0;
}