Cod sursa(job #1573996)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 20 ianuarie 2016 02:56:22
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <vector>
#define UI unsigned int
#define pii pair <UI, UI>
#define pb push_back
#define mp make_pair

using namespace std;

const int NMax = (1<<20) + 10;
const int MOD = 666013;
vector <pii> H[MOD];
int L, U, N;
UI a[NMax];

void Insert(const UI x)
{
    int cod = x % MOD;
    for (vector <pii> :: iterator it = H[cod].begin(); it != H[cod].end(); ++ it)
        if (it -> first == x)
        {
            ++ it -> second;
            return ;
        }
    H[cod].pb(mp(x, 1));
}

int Search(const UI x)
{
    int cod = x % MOD;
    for (vector <pii> :: iterator it = H[cod].begin(); it != H[cod].end(); ++ it)
        if (it -> first == x)
            return it -> second;
    return 0;
}

int Delete(const UI x)
{
    int cod = x % MOD;
    for (vector <pii> :: iterator it = H[cod].begin(); it != H[cod].end(); ++ it)
        if (it -> first == x)
        {
            -- it -> second;
            if (it -> second == 0)
            {
                *it = H[cod].back();
                H[cod].pop_back();
                return 0;
            }
            return it -> second;
        }
    return 0;
}

long long Solve(const int SZ)
{
    long long ret = 0;
    for (int i = 0; i < MOD; ++ i)
        H[i].clear();
    int st = 1, dr;
    int count = 0;
    for (dr = 1; dr <= N; ++ dr)
    {
        if (Search(a[dr]) == 0)
            ++ count;
        Insert(a[dr]);
        while (count > SZ)
        {
            int rem = Delete(a[st]);
            if (rem == 0)
                -- count;
            ++ st;
        }
        ret += (dr - st + 1);
    }
    return ret;
}

int main()
{
    ifstream f ("secv5.in");
    f >> N >> L >> U;
    for (int i = 1; i <= N; ++ i)
        f >> a[i];
    f.close();
    ofstream g ("secv5.out");
    g << Solve(U) - Solve(L-1) << "\n";
    g.close();
    return 0;
}