Cod sursa(job #1256404)

Utilizator MarronMarron Marron Data 6 noiembrie 2014 10:52:26
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <deque>


const int MOD = 666013;
class Hash {
private:
	std::vector<int> a[MOD];

public:
	int size;
	int different;


	Hash() {
		size = 0;
		different = 0;
	}

	void insert(int x) {
		int i = x % MOD;

		bool ok = false;
		for (size_t j = 0; j < a[i].size(); j++) {
			if (a[i][j] == x) {
				ok = true;
				break;
			}
		}

		if (ok == false) {
			different++;
		}
		size++;
		a[i].push_back(x);
	}

	void erase(int x) {
		int i = x % MOD;

		for (size_t j = 0; j < a[i].size(); j++) {
			if (a[i][j] == x) {
				a[i].erase(a[i].begin() + j);
				size--;
				break;
			}
		}

		bool ok = false;
		for (size_t j = 0; j < a[i].size(); j++) {
			if (a[i][j] == x) {
				ok = true;
				break;
			}
		}

		if (ok == false) {
			different--;
		}
	}
};


std::ifstream f("secv5.in");
std::ofstream g("secv5.out");
Hash hmin, hmax;
std::queue<int> qmin, qmax;


int main()
{
	int n, mn, mx;
	f >> n >> mn >> mx;

	int sol = 0;
	for (int i = 1; i <= n; i++) {
		int x; f >> x;

		hmin.insert(x);
		hmax.insert(x);
		qmin.push(x);
		qmax.push(x);

		if (hmax.different < mn) {
			continue;
		}

		while (hmin.different >= mn) {
			hmin.erase(qmin.front());
			qmin.pop();
		}
		while (hmax.different > mx) {
			hmax.erase(qmax.front());
			qmax.pop();
		}
		
		sol += (qmax.size() - qmin.size());
	}

	g << sol << std::endl;

	
	f.close();
	g.close();
	return 0;
}