Cod sursa(job #959939)

Utilizator tudorv96Tudor Varan tudorv96 Data 9 iunie 2013 14:14:41
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#include <vector>
using namespace std;

#define key 666013
#define h(x) ((x)%key)
#define in "secv5.in"
#define out "secv5.out"
#define xx first
#define yy second
#define N ((1 << 20) + 5)

typedef unsigned u;
typedef pair <u, u> elem;
typedef vector <elem> :: iterator IT;

vector <elem> list[key];
u norm[N], c[2][N], L, U, n;

IT search(elem x) {
	for (IT it = list[h(x.xx)].begin(); it != list[h(x.xx)].end(); ++it)
		if (it -> xx == x.xx)
			return it;
	return list[h(x.xx)].end();
}

int main () {
	ifstream fin (in);
	fin >> n >> L >> U;
	for (u i = 0; i < n; ++i) {
		int x;
		fin >> x;
		IT it = search(elem(x, i));
		if (it != list[h(x)].end())
			norm[i] = it -> yy;
		else {
			list[h(x)].push_back(elem(x, i));
			norm[i] = i;
		}
	}
	u ll, uu, dl, du;
	uu = ll = dl = du = 0;
	u long long sol = 0;
	for (u i = 0; i < n; ++i) {
		while (ll < n && dl < L)
			dl += ((c[0][norm[ll++]]++) == 0);
		while (uu < n && du + !c[1][norm[uu]] <= U)
			du += ((c[1][norm[uu++]]++) == 0);
		if (dl >= L)
			sol += (uu - ll + 1);
		dl -= ((--c[0][norm[i]]) == 0);
		du -= ((--c[1][norm[i]]) == 0);
	}
	ofstream fout (out);
	fout << sol;
	fout.close();
	return 0;
}