Cod sursa(job #9610)

Utilizator IgnitionMihai Moraru Ignition Data 27 ianuarie 2007 16:23:51
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 1.13 kb
#include <stdio.h>
#include <map>

using namespace std;

#define MN (1024)

int N, n[MN], X, Left, Right;
map<int, int> c[MN];

inline void add(map<int, int> &m, int x)
{
	if(m.find(x) != m.end()) {
		int tmp = m[x]+1;
		m[x] = tmp;
	} else m[x] = 1;
}

inline void sub(map<int, int> &m, int x)
{
	if(m.find(x) != m.end()) {
		int tmp = m[x];
		if(tmp > 1)
			m[x] = tmp-1;
		else m.erase(x);
	}
}

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

	int i, j, tmp;
	scanf("%d %d %d", &N, &Left, &Right);
	for(i = 0; i < N; ++ i)
		scanf("%d", &n[i]);
	c[0][n[0]] = 1;
	if(Left <= 1 && 1 <= Right)
		++ X;
	//map<int, int>::iterator mapi, mapj;
	for(i = 1; i < N; ++ i) {
		c[i] = c[i-1];
		add(c[i], n[i]);
		/*
		for(map<int, int>::iterator it = c[i].begin(); it != c[i].end(); ++ it)
			printf("%d %d\n", (*it).first, (*it).second);
		printf("size = %d\n", c[i].size());
		*/
		tmp = c[i].size();
		if(Left <= tmp && tmp <= Right)
			++ X;
	}
	for(i = 0; i < N-1; ++ i) for(j = i+1; j < N; ++ j) {
		sub(c[j], n[i]);
		tmp = c[j].size();
		if(Left <= tmp && tmp <= Right)
			++ X;
	}

	printf("%d\n", X);

	return 0;
}