Cod sursa(job #1144788)

Utilizator gedicaAlpaca Gedit gedica Data 17 martie 2014 16:52:02
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX=( 1<<20 )+2;

int n, l, u;

unsigned int a[NMAX];

ifstream in( "secv5.in" );
ofstream out( "secv5.out" );

struct norm
{
    unsigned int value;
    int position;
    bool operator <(const norm &A) const
    {
        return value < A.value;
    }
};

norm v[NMAX];
int frecv[NMAX];

inline void Citeste_frumos()
{
    in >> n >> l >> u;
    int i;
    for (i=1; i<= n; ++i)
    {
        in >> a[i];
        v[i].value = a[i];
        v[i].position = i;
    }
}

inline void Normalizare()
{
    sort(v+1, v+n+1);
    for (int i = 1; i<=n; ++i)
        a[v[i].position] = a[v[i-1].position] + !(v[i].value == v[i-1].value);
}

inline long long Query(int p)
{
    long long sol = 0LL;
    for (int i=0; i<NMAX; i++)
        frecv[i] = 0;
    int st, dr, cnt;
    st = 1;
    dr = 0;
    cnt = 0;

    while (dr <= n && cnt<=p)
    {
        ++dr;
        if (++frecv[a[dr]] == 1)
            ++cnt;
    }
    sol += dr - st;
    if (--frecv[a[st]] == 0)
        --cnt;
    ++st;
    while (dr<=n)
    {
        while (cnt>p)
        {
            sol += dr-st;
            if (--frecv[a[st]] == 0)
                --cnt;
            ++st;
        }
        while (dr<=n && cnt<=p)
        {
            ++dr;
            if (++frecv[a[dr]] == 1)
                ++cnt;
        }
    }
    while (st<=n)
    {
        sol += dr-st;
        ++st;
    }
    return sol;

}

inline void Rezolva_frumos()
{
    Normalizare();
    out << Query(u) - Query(l-1) << "\n";
}

int main()
{
    Citeste_frumos();
    Rezolva_frumos();
    return 0;
}