Pagini recente » Cod sursa (job #1440009) | Cod sursa (job #2775537) | Cod sursa (job #266793) | Cod sursa (job #1202201) | Cod sursa (job #2246203)
#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;
}