Cod sursa(job #1153936)

Utilizator dr_personalityEftime Andrei Horatiu dr_personality Data 25 martie 2014 21:00:37
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in( "secv5.in" );
ofstream out( "secv5.out" );


const int NMAX=( 1<<20 )+2;
int n, l, u;
unsigned int ve[NMAX];
int st, dr, act;

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

norm v[NMAX];
int poz[NMAX];

long long rasp(int p)
{
    long long rez = 0LL;

    for(int i = 0; i<NMAX; i++)
        poz[i] = 0;

    st = 1;
    dr = 0;
    act = 0;

    while (dr<=n && act<=p)
    {
        ++dr;
        if (++poz[ve[dr]]==1)
            ++act;
    }
    rez += dr - st;

    if (--poz[ve[st]] == 0)
        --act;

    ++st;
    while (dr<=n)
    {
        while(act>p)
        {
            rez += dr - st;

            if (--poz[ve[st]]==0)
                --act;
            ++st;
        }
        while(dr<=n && act<=p)
        {
            ++dr;
            if (++poz[ve[dr]] == 1)
                ++act;
        }
    }

    while (st<=n)
    {
        rez += dr - st;
        ++st;
    }
    return rez;
}

int main()
{
	int player_unu=0;
    in>>n>>l>>u;

    for(int i = 1; i<=n; i++)
    {
        in>>ve[i];
        v[i].val = ve[i];
        v[i].pos = i;
    }

    sort(v + 1, v + n + 1);

    for (int i = 1; i<=n; i++)
	{
		if(v[i].val==v[i-1].val)
			ve[v[i].pos] = ve[v[i-1].pos];
		else
			ve[v[i].pos] = ve[v[i-1].pos] + 1;
	}

    out<<rasp(u) - rasp(l-1)<<'\n';
    return player_unu;
}