Pagini recente » Cod sursa (job #499970) | Cod sursa (job #611750) | Cod sursa (job #3275333) | Cod sursa (job #1868012) | Cod sursa (job #650573)
Cod sursa(job #650573)
#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;
}