Cod sursa(job #959953)

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

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

typedef unsigned long u;
typedef pair <u, u> elem;

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

int h(u x) {
	return ((x < key) ? x : x % key);
}	

int search(elem x) {
	int H = h(x.xx);
	for (u i = 0; i < list[H].size(); ++i)
		if (list[H][i].xx == x.xx)
			return list[H][i].yy;
	list[H].push_back (x);
	return x.yy;
}

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