Cod sursa(job #995252)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 8 septembrie 2013 13:06:58
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX (1<<20)+2

using namespace std;

int n, l, u;
unsigned int a[NMAX];
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 Read()
{
    ifstream f ("secv5.in");
    f>>n>>l>>u;
    int i;
    for (i=1; i<=n; ++i)
    {
        f>>a[i];
        v[i].value = a[i];
        v[i].position = i;
    }
    f.close();
}

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 Solve()
{
    Normalizare();
    ofstream g ("secv5.out");
    g<<Query(u) - Query(l-1)<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    return 0;
}