Cod sursa(job #712052)

Utilizator dacyanMujdar Dacian dacyan Data 12 martie 2012 23:43:44
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define MOD 666013
#define DIM (1 << 20) + 1
using namespace std;

typedef unsigned long long LL;
ofstream fout("secv5.out");


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

LL Secv(int);
vector<int>::iterator Find(int x);
void Insert(int);
void Erase(int);


int main()
{
    ifstream fin("secv5.in");
    fin >> n >> L >> U;
    int x;
    for (int i = 1; i <= n; ++i)
    {
        fin >> x;
        b.push_back(make_pair(x, i));
    }
    fin.close();
    
    sort(b.begin(), b.end());
    int norm = 0;
    for (int 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;
    
    fout <<  Secv(1) << '\n';
    fout.close();
    return 0;
}    

LL Secv(int dim)
{
    if (!dim) return 0;
    LL sol(0), nr(0);
    G.clear(); G.resize(MOD);
    for (int st = 1, dr = 1; dr <= n; ++dr)
    {
        if (Find(a[dr]) == G[a[dr]%MOD].end()) nr++;
        Insert(a[dr]);
        while (nr > dim && st <= dr)
        {
            Erase(a[st]);
            if (Find(a[st]) == G[dr%MOD].end()) 
                        nr--;
            st++;
        }
        sol += dr - st + 1;
    }
    return sol;
}

vector<int>::iterator Find(int x)
{
    int list = x % MOD;
    for (vector<int>::iterator it = G[list].begin(); it != G[list].end(); ++it)
        if (*it == x) return it;
    return G[list].end();
}

void Insert(int x)
{
    G[x%MOD].push_back(x);
}

void Erase(int x)
{
    vector<int>::iterator it = Find(x);
    if (it != G[x%MOD].end())
        G[x%MOD].erase(it);
}