Cod sursa(job #1159149)

Utilizator gedicaAlpaca Gedit gedica Data 29 martie 2014 13:05:20
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define Nmax 1000000
using namespace std;
int n, l, u;
int a[Nmax];
ifstream fin( "secv5.in" );
ofstream fout( "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 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;

}
int main()
{
       fin >> n >> l >> u;
    int i;
    for (i=1; i<= n; ++i)
    {
        fin >> a[i];
        v[i].value = a[i];
        v[i].position = i;
    }
    Normalizare();
    fout << Query(u) - Query(l-1);
    return 0;
}