Cod sursa(job #712089)

Utilizator dacyanMujdar Dacian dacyan Data 13 martie 2012 01:03:35
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <string>
#define MOD 666013
#define DIM (1 << 20) + 1
using namespace std;

typedef unsigned long long LL;


LL n, L, U, norm;
vector<vector<LL> > G;
vector<pair<LL, LL> > b;
LL a[DIM];
vector<short int> f;

LL Secv(LL);


int main()
{
    freopen("secv5.in", "r", stdin);
    scanf("%Ld %Ld %Ld", &n, &L, &U); 
    LL x;
    for (LL i = 1; i <= n; ++i)
    {
        scanf("%Ld", &x);
        b.push_back(make_pair(x, i));
    }
    fclose(stdin);
    
    sort(b.begin(), b.end());
    for (LL i = 0; i < b.size(); ++i)
        if (!i || b[i].first != b[i-1].first) 
                a[b[i].second] = ++norm;
        else 
                a[b[i].second] = norm;
    
	ofstream fout("secv5.out");
    fout << Secv(U) - Secv(L-1)  << '\n';
    fout.close();
    return 0;
}    

LL Secv(LL dim)
{
	f.clear();
	f.resize(norm+1, 0);
    if (!dim) return 0;
    LL sol(0), nr(0);
    G.clear(); G.resize(MOD);
    for (LL st = 1, dr = 1; dr <= n; ++dr)
    {
        if (!f[a[dr]]) nr++;
        f[a[dr]]++;
        while (nr > dim)
        {
            f[a[st]]--;
            if (!f[a[st]]) 
                        nr--;
            st++;
        }
        sol += dr - st + 1;
    }
    return sol;
}