Cod sursa(job #3356635)

Utilizator lefterache_stefanLefterache Stefan lefterache_stefan Data 2 iunie 2026 20:57:59
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

class Secv5Solver {
   public:
	Secv5Solver(int n, int l, int u) : n(n), l_bound(l), u_bound(u), x(n) {}
	void set_value(int i, unsigned val) { x[i] = val; }
	long long solve() {
		coordinate_compress();
		return get_at_most(u_bound) - get_at_most(l_bound - 1);
	}

   private:
	int n, l_bound, u_bound;
	vector<unsigned> x;

	void coordinate_compress() {
		vector<pair<unsigned, int>> y(n);
		for (int i = 0; i < n; ++i) {
			y[i] = {x[i], i};
		}
		sort(y.begin(), y.end());

		int current_id = 0;
		for (int i = 0; i < n; ++i) {
			if (i > 0 && y[i].first != y[i - 1].first) {
				current_id++;
			}
			x[y[i].second] = current_id;
		}
	}

	long long get_at_most(int k) {
		if (k <= 0) {
			return 0;
		}

		vector<int> freq(n, 0);
		int distinct_count = 0, left = 0;
		long long result = 0;

		for (int right = 0; right < n; ++right) {
			if (freq[x[right]]++ == 0) {
				distinct_count++;
			}

			while (distinct_count > k) {
				if (--freq[x[left++]] == 0) {
					distinct_count--;
				}
			}
			result += (right - left + 1);
		}
		return result;
	}
};

int main() {
	int n, l, u;
	fin >> n >> l >> u;
	Secv5Solver solver(n, l, u);
	for (int i = 0; i < n; ++i) {
		unsigned val;
		fin >> val;
		solver.set_value(i, val);
	}
	fout << solver.solve();
}