Cod sursa(job #3364061)

Utilizator MihaiDraghiciMIHAI DRAGHICI MihaiDraghici Data 28 august 2026 19:23:45
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

#define ll long long

using namespace std;

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


struct query {

	int l, r, idx;

};


vector<ll> aib;
vector<int> v;
vector<int> ante;
vector<ll> ans;
vector<query> queries;
int n, k, q;

void update(int i, int val) {

	for (; i <= n; i+=(i & (-i))) {
		aib[i] += val;
	}

}

ll take(int i) {

	ll sum = 0;
	for (; i > 0; i-=(i & (-i))) {
		sum += aib[i];
	}

	return sum;

}


bool cmp(query a, query b) {

	return a.r < b.r;

}


int main() {

	fin >> n >> k >> q;

	aib.resize(n + 2);
	v.resize(n + 2);
	ante.resize(k + 2);
	ans.resize(q);
	queries.resize(q);

	for (int i = 1; i <= n; i++) {
		fin >> v[i];
	}

	for (int i = 0; i < q; i++) {

		fin >> queries[i].l >> queries[i].r;
		queries[i].idx = i;

	}

	sort(queries.begin(), queries.end(), cmp);

	int j = 0;

	for (int i = 1; i <= n; i++) {

		if (ante[v[i]] != 0) {
			update(ante[v[i]], -v[i]);
		}

		update(i, v[i]);

		ante[v[i]] = i;

		while (j < q && queries[j].r == i) {

			int l = queries[j].l;
			int r = queries[j].r;
			int idx = queries[j].idx;

			ans[idx] = (take(r) - take(l - 1)) % 666013;

			j++;

		}

	}

	for (int i = 0; i < q; i++) {
		fout << ans[i] << '\n';
	}

	return 0;
}