Pagini recente » Cod sursa (job #2636019) | Cod sursa (job #1774430) | Cod sursa (job #1257524) | Cod sursa (job #1761554) | Cod sursa (job #2549765)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
class FenTree {
private:
int n;
vector<int64_t> bit;
public:
FenTree(int n) :
n(n), bit(n + 1) { }
void update(int pos, int val) {
for (int i = pos; i <= n; i += i & -i)
bit[i] += val;
}
int64_t query(int pos) {
int64_t sum = 0;
for (int i = pos; i >= 1; i -= i & -i)
sum += bit[i];
return sum;
}
int64_t query(int left, int right) {
return query(right) - query(left - 1);
}
};
int main() {
int n, k, q;
fin >> n >> k >> q;
vector<int> v(n + 1);
for (int i = 1; i <= n; i++)
fin >> v[i];
vector<int> next(n + 1), last(k + 1, n + 1);
for (int i = n; i >= 1; i--) {
next[i] = last[v[i]];
last[v[i]] = i;
}
vector<int64_t> qry(q);
vector<vector<int>> left(n + 1), right(n + 1);
for (int i = 0; i < q; i++) {
int x, y; fin >> x >> y;
left[x - 1].push_back(i);
right[y].push_back(i);
qry[i] = y;
}
vector<int64_t> sol(q);
FenTree bit(n + 1);
for (int i = 1; i <= n; i++) {
bit.update(next[i], v[i]);
for (int j : left[i])
sol[j] -= bit.query(qry[j] + 1, n + 1);
for (int j : right[i])
sol[j] += bit.query(qry[j] + 1, n + 1);
}
for (int i = 0; i < q; i++)
fout << sol[i] << '\n';
fout.close();
return 0;
}