Cod sursa(job #2246203)

Utilizator cautionPopescu Teodor caution Data 26 septembrie 2018 19:51:14
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 100000;

long long bit[kMaxN + 1];

void bit_update(int pos, int val)
{
	while (pos <= kMaxN) {
		bit[pos] += val;
		pos += pos & -pos;
	}
}

long long bit_query(int pos)
{
	long long ans = 0;
	while (pos > 0) {
		ans += bit[pos];
		pos -= pos & -pos;
	}
	return ans;
}

struct query {
	int l, r, index;
};

int main()
{
	ios_base::sync_with_stdio(false);
	freopen("distincte.in", "rt", stdin);
	freopen("distincte.out", "wt", stdout);

	int n, k, m, *v, *ans;
	query *queries;
	cin >> n >> k >> m;
	
	v = new int[n + 1];
	queries = new query[m];
	ans = new int[m];
	
	for (int i = 1; i <= n; ++i) cin >> v[i];
	
	for (int i = 0; i < m; ++i) {
		cin >> queries[i].l >> queries[i].r;
		queries[i].index = i; 
	}
	
	sort(queries, queries + m, [](const query& x, const query& y) {
		return x.r < y.r;
	});
	
	int current_pos = 1;
	unordered_map<int, int> H; // value to position
	for (int i = 0; i < m; ++i) {
		while (current_pos <= queries[i].r) {
			auto it = H.find(v[current_pos]);
			if (it != H.end()) {
				bit_update(it->second, -v[current_pos]);
			}
			H[v[current_pos]] = current_pos;
			bit_update(current_pos, v[current_pos]);
			++current_pos;
		}
		ans[queries[i].index] = bit_query(queries[i].r) - bit_query(queries[i].l - 1);
	}
	
	for (int i = 0; i < m; ++i) cout << ans[i] << '\n';
	
	return 0;
}