Cod sursa(job #650573)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 18 decembrie 2011 14:17:51
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <cstdio>
#include <map>

using namespace std;

const int NMAX = 1 << 20;

struct nod
{
    int poz;
    nod* next;
    nod* prev;
};

map<unsigned int, nod*> M;
int N, L, U;
unsigned int V[NMAX];

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
    
    scanf("%d %d %d ", &N, &L, &U);
    
    for(int i = 0; i < N; i++)
        scanf("%u", &V[i]);
    
    long long result = 0;
    
    nod* head = new nod;
    head->next = NULL;
    head->prev = NULL;
    head->poz = N - 1;
    M[V[N - 1]] = head;
    nod* l = head, *u = head;
    
    U++;
    if(L == 1) result++;
    
    int nr_elem = 1;
    
    for(int i = N - 2; i >= 0; i--)
    {
        nod* prev = NULL;
        
        if(M.find(V[i]) != M.end())
            prev = M[V[i]];
        
        if(prev == NULL)
        {
            nod* new_nod = new nod;
            new_nod->poz = i;
            new_nod->prev = NULL;
            new_nod->next = head;
            head->prev = new_nod;
            head = new_nod;
            M[V[i]] = new_nod;
            
            nr_elem++;
            
            if(nr_elem > L) l = l->prev;
            if(nr_elem > U) u = u->prev;
        }
        else
        {
            if(prev == head);
            else
            if(prev->poz < l->poz)
            {
                nod* prevnod = prev->prev;
                nod* nextnod = prev->next;
                     
                prevnod->next = nextnod;
                nextnod->prev = prevnod;
                prev->prev = NULL;
                prev->next = head;
                head->prev = prev;
                head = prev;
            }
            else if(prev->poz < u->poz)
            {   
                nod* prevnod = prev->prev;
                nod* nextnod = prev->next;
                     
                prevnod->next = nextnod;
                nextnod->prev = prevnod;
                prev->prev = NULL;
                prev->next = head;
                head->prev = prev;
                head = prev;
                
                if(l == prev)
                    l = prevnod;
                else l = l->prev;
            }
            else
            {   
                nod* prevnod = prev->prev;
                nod* nextnod = prev->next;
                     
                prevnod->next = nextnod;
                if(nextnod != NULL)
                nextnod->prev = prevnod;
                prev->prev = NULL;
                prev->next = head;
                head->prev = prev;
                head = prev;
                
                if(prev == u)
                    u = prevnod;
                else if(nr_elem > U) u = u->prev;
                
                if(nr_elem > L) l = l->prev;
            }
            prev->poz = i;
        }
        result += (nr_elem < U ? N : u->poz) - (nr_elem < L ? N : l->poz);
    }
    
    printf("%lld\n", result);
    return 0;
}