Pagini recente » Cod sursa (job #2919002) | Cod sursa (job #1525539) | Cod sursa (job #1366412) | Cod sursa (job #2302406) | Cod sursa (job #3257872)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
set<int> tree[400001];
int sum[400001];
int a[100001];
void buildTree(int left, int right, int currentNode) {
if (left == right) {
tree[currentNode].insert(a[left]);
sum[currentNode] = a[left];
return;
}
buildTree(left, (left + right) / 2, currentNode * 2);
buildTree((left + right) / 2 + 1, right, currentNode * 2 + 1);
for (set<int>::iterator it = tree[currentNode * 2].begin(); it != tree[currentNode * 2].end(); ++it) {
if (tree[currentNode].count(*it) == 0) {
sum[currentNode] += *it;
}
tree[currentNode].insert(*it);
}
for (set<int>::iterator it = tree[currentNode * 2 + 1].begin(); it != tree[currentNode * 2 + 1].end(); ++it) {
if (tree[currentNode].count(*it) == 0) {
sum[currentNode] += *it;
}
tree[currentNode].insert(*it);
}
}
int query(int left, int right, int currentNode, int startPos, int endPos) {
if (right < startPos || left > endPos) {
// cout << left << ' ' << right << ": " << sum[currentNode] << '\n';
return 0;
} else if (startPos <= left && right <= endPos) {
// cout << left << ' ' << right << ": " << sum[currentNode] << '\n';
return sum[currentNode];
}
return query(left, (left + right) / 2, currentNode * 2, startPos, endPos) + query((left + right) / 2 + 1, right, currentNode * 2 + 1, startPos, endPos);
}
int main() {
int n, k, m;
fin >> n >> k >> m;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
}
buildTree(1, n, 1);
for (int i = 1; i <= m; ++i) {
int startPos, endPos;
fin >> startPos >> endPos;
fout << query(1, n, 1, startPos, endPos) << '\n';
}
return 0;
}
/*
*/