Pagini recente » Cod sursa (job #64352) | Cod sursa (job #2347337) | Cod sursa (job #3236414) | Cod sursa (job #297439) | Cod sursa (job #2845178)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("distincte.in");
ofstream fout ("distincte.out");
const int NMAX = 1e5;
struct Query {
int st, dr, pos, ans;
};
int v[NMAX + 2];
int last[NMAX + 2];
int aib[NMAX + 2];
Query arr[NMAX + 2];
bool cmp1 (Query A, Query B) {
return A.dr < B.dr;
}
bool cmp2 (Query A, Query B) {
return A.pos < B.pos;
}
int query (int pos) {
int s = 0;
for (int i = pos; i > 0; i -= (i & (-i)))
s += aib[i];
return s;
}
void update (int pos, int val) {
for (int i = pos; i <= NMAX; i += (i & (-i)))
aib[i] += val;
}
int main() {
int n, k, m, i, index;
fin >> n >> k >> m;
for (i = 1; i <= n; ++i)
fin >> v[i];
for (i = 1; i <= m; ++i) {
fin >> arr[i].st >> arr[i].dr;
arr[i].pos = i;
}
sort(arr + 1, arr + 1 + m, cmp1);
index = 0;
for (i = 1; i <= m; ++i) {
while (index + 1 <= arr[i].dr) {
++index;
if (last[v[index]])
update(last[v[index]], -v[index]);
last[v[index]] = index;
update(index, v[index]);
}
arr[i].ans = query(arr[i].dr) - query(arr[i].st - 1);
}
sort(arr + 1, arr + 1 + m, cmp2);
for (i = 1; i <= m; ++i)
fout << arr[i].ans << "\n";
return 0;
}