#include <bits/stdc++.h>
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
int n, k, m, a[100001], sortedQueriesLen;
pair<int, int> queries[100001];
pair<int, int> sortedQueries[100001];
pair<int, int> tree[400001];
map<pair<int, pair<int, int>>, bool> wasAdded;
map<pair<int, int>, int> ans;
void updateTree(int left, int right, int currentNode, int pos, pair<int, int> query) {
if (pos < left || pos > right) {
return;
} else if (left == right) {
tree[currentNode] = query;
return;
}
updateTree(left, (left + right) / 2, currentNode * 2, pos, query);
updateTree((left + right) / 2 + 1, right, currentNode * 2 + 1, pos, query);
if (tree[currentNode * 2].second > tree[currentNode * 2 + 1].second) {
tree[currentNode] = tree[currentNode * 2];
} else if (tree[currentNode * 2].second <= tree[currentNode * 2 + 1].second) {
tree[currentNode] = max(tree[currentNode * 2], tree[currentNode * 2 + 1]);
}
}
void addNewValues(int left, int right, int currentNode, int pos) {
if (tree[currentNode].second < pos) {
return;
} else if (left == right) {
if (wasAdded[{a[pos], tree[currentNode]}] == 0) {
ans[tree[currentNode]] += a[pos];
wasAdded[{a[pos], tree[currentNode]}] = 1;
}
return;
}
addNewValues(left, (left + right) / 2, currentNode * 2, pos);
addNewValues((left + right) / 2 + 1, right, currentNode * 2 + 1, pos);
}
int main() {
fin >> n >> k >> m;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
}
for (int i = 1; i <= m; ++i) {
fin >> queries[i].first >> queries[i].second;
sortedQueries[++sortedQueriesLen] = queries[i];
}
sort(sortedQueries + 1, sortedQueries + sortedQueriesLen + 1);
for (int i = 1, j = 1; i <= n; ++i) {
while (j <= m && i == sortedQueries[j].first) {
updateTree(1, n, 1, i, sortedQueries[j]);
++j;
}
addNewValues(1, n, 1, i);
}
for (int i = 1; i <= m; ++i) {
fout << ans[queries[i]] << '\n';
}
return 0;
}