Pagini recente » Cod sursa (job #3364247) | Cod sursa (job #3364220) | Cod sursa (job #3364244) | Cod sursa (job #3364213) | Cod sursa (job #3364061)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#define ll long long
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
struct query {
int l, r, idx;
};
vector<ll> aib;
vector<int> v;
vector<int> ante;
vector<ll> ans;
vector<query> queries;
int n, k, q;
void update(int i, int val) {
for (; i <= n; i+=(i & (-i))) {
aib[i] += val;
}
}
ll take(int i) {
ll sum = 0;
for (; i > 0; i-=(i & (-i))) {
sum += aib[i];
}
return sum;
}
bool cmp(query a, query b) {
return a.r < b.r;
}
int main() {
fin >> n >> k >> q;
aib.resize(n + 2);
v.resize(n + 2);
ante.resize(k + 2);
ans.resize(q);
queries.resize(q);
for (int i = 1; i <= n; i++) {
fin >> v[i];
}
for (int i = 0; i < q; i++) {
fin >> queries[i].l >> queries[i].r;
queries[i].idx = i;
}
sort(queries.begin(), queries.end(), cmp);
int j = 0;
for (int i = 1; i <= n; i++) {
if (ante[v[i]] != 0) {
update(ante[v[i]], -v[i]);
}
update(i, v[i]);
ante[v[i]] = i;
while (j < q && queries[j].r == i) {
int l = queries[j].l;
int r = queries[j].r;
int idx = queries[j].idx;
ans[idx] = (take(r) - take(l - 1)) % 666013;
j++;
}
}
for (int i = 0; i < q; i++) {
fout << ans[i] << '\n';
}
return 0;
}