Cod sursa(job #1189064)

Utilizator IonSebastianIon Sebastian IonSebastian Data 21 mai 2014 11:36:45
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>

using namespace std;

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

const int MAX_N = 1 << 20, KEY = 1 << 13;

int lst[KEY], urm[MAX_N+1], val[MAX_N+1], v[MAX_N+1];

int n, l, u;

int nr;

int nrdif, drl, dru, st = 1;

bool inline check(int x)
{
    int p = lst[x&(KEY-1)];
    while(p != 0 && val[p] != x)
    {
        p = urm[p];
    }
    return p != 0;
}

void inline del(int x)
{
    nrdif--;
    int r = x&(KEY-1), p;
    if(x == val[lst[r]])
    {
        lst[r] = urm[lst[r]];
        return;
    }
    p = lst[r];
    while(urm[p] != 0 && val[urm[p]] != x)
    {
        p = urm[p];
    }
    if(val[urm[p]] == x)
    {
        urm[p] = urm[urm[p]];
    }
}

void inline add(int x)
{
    if(!check(x))
    {
        nrdif++;
        int place = x&(KEY-1);
        val[++nr] = x;
        urm[nr] = lst[place];
        lst[place] = nr;
    }
}

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

    int x;

    for(int i = 1; i <= n; i++)
    {
        in >> v[i];
    }
    while(st <= n)
    {
        while(nrdif < l && drl <= n)
        {
            add(v[++drl]);
        }
        if(dru < drl)
        {
            dru = drl;
        }
        while(nrdif < u && dru <= n)
        {
            add(dru++);
            nrsub++;
        }
        if(v[st] != v[st+1])
        {
            del(v[st]);
        }
        st++;
        if(nrdif >= l && nrdif <= u)
        {
            nrsub++;
        }
    }
    out << nrsub;
    return 0;
}