Cod sursa(job #10053)

Utilizator wefgefAndrei Grigorean wefgef Data 27 ianuarie 2007 20:46:10
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
#include <string.h>
#include <algorithm>

using namespace std;

#define Nmax (1 << 20)

struct el
{
	unsigned int val;
	int poz;
} u[Nmax];

int v[Nmax];
int frec[Nmax];
int n, m, a, b;

void readdata()
{
	freopen("secv5.in", "r", stdin);
	freopen("secv5.out", "w", stdout);
	
	scanf("%d %d %d", &n, &a, &b);
	for (int i = 0; i < n; ++i)
	{
		scanf("%u", &u[i].val);
		u[i].poz = i;
	}
}


long long eval(int k)
{
	int i, j = 0, cnt = 0;
	long long rez = 0;
	
	if (k == a-1) memset(frec, 0, sizeof(frec));
	for (i = 0; i < n; ++i)
	{
		cnt += ++frec[v[i]] == 1;
		
		while (1)
		{
			if (--frec[v[j]] == 0)
			{
				--cnt;
				break;
			}
			++j;
		}
		rez += i-j+1;
	}
	return rez;
}

int inline cmp(struct el a, struct el b)
{
	return a.val < b.val;
}

void solve()
{
	int i;
	
	sort(u, u+n, cmp);
	
	v[ u[0].poz ] = 0;
	for (i = 1; i < n; ++i)
	{
		if (u[i].val > u[i-1].val) ++m;
		v[ u[i].poz ] = m;
	}
	
	printf("%lld\n", eval(b) - eval(a-1));
}

int main()
{
	readdata();
	solve();
	return 0;
}