Cod sursa(job #149194)

Utilizator crawlerPuni Andrei Paul crawler Data 5 martie 2008 13:49:05
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>

#define Nmax (1<<(20))
#define MOD 986581

struct hash{ int nr,X, next; };

hash h[MOD+Nmax];
int cnt=MOD,nr,n, v[Nmax], l[Nmax], L,U;

void insert(int x)
{
	int tmp = x%MOD;
	if (h[tmp].nr == 0)
	{
		h[tmp].nr = x;
		h[tmp].X = ++nr;
	}
		else
	{
		while (h[tmp].next != 0) tmp = h[tmp].next;
		h[tmp].next = ++cnt;
		h[cnt].nr = x;
		h[cnt].X = ++nr;
	}
}

int find(int x)
{
	int tmp=x%MOD;
	if (h[tmp].nr)
	do
	{
		if (h[tmp].nr == x) return h[tmp].X;
		tmp = h[tmp].next;
	}
	while (h[tmp].next != 0);
	return 0;
}

int min(int a, int b)
{
	if (a<b) return a;
	return b;
}

int W(int H)
{
	int ret=0,O=H-1;
	for (int i=1;i<=n;++i)
	{
		ret += l[min(v[i]+O,nr)] - i + 1;
	}
	return ret;
}


int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);

	scanf("%d%d%d", &n,&L,&U);

	int i,x;

	for (i=1;i<=n;++i)
	{
		scanf("%d", &x);
		v[i] = find(x);
		if (v[i]==0)
		{
			insert(x);
			v[i] = nr;
                }
		l[v[i]] = i;
	}

	printf("%d\n", W(U)-W(L-1));

/*
	for (i=1;i<=n;++i) printf("%d ", v[i]);printf("\n");
	for (i=1;i<=nr;++i) printf("%d ", l[i]);printf("\n");
*/

	return 0;
}