Pagini recente » Cod sursa (job #2946502) | Cod sursa (job #398164) | Cod sursa (job #659996) | Cod sursa (job #836361) | Cod sursa (job #2274965)
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 1e5 + 5;
struct Query {
int s, d, idx; };
Query sir[N];
int f[N], nxt[N], v[N];
i64 ans[N], aib[N];
static int lsb(const int &x) {
return x & -x; }
static void update(int pos, int val) {
for (; pos < N; pos+= lsb(pos))
aib[pos]+= val; }
static i64 query(int pos) {
i64 ant = 0;
for (; pos > 0; pos-= lsb(pos))
ant+= aib[pos];
return ant; }
int main() {
freopen("distincte.in", "r", stdin);
freopen("distincte.out", "w", stdout);
int n, m, ptr, junk;
scanf("%d %d %d", &n, &junk, &m);
for (int i = 1; i <= n; i++) {
scanf ("%d", &v[i]);
if (f[v[i]] > 0)
nxt[f[v[i]]] = i;
else
update(i, v[i]);
f[v[i]] = i; }
for (int i = 1; i <= m; i++) {
scanf("%d %d", &sir[i].s, &sir[i].d);
sir[i].idx = i; }
sort(sir + 1, sir + m + 1, [&](Query a, Query b) -> bool {
if (a.s == b.s)
return a.d < b.d;
else
return a.s < b.s; } );
ptr = 1;
for (int i = 1; i <= m; ++i) {
while (ptr < sir[i].s) {
update(i, -v[i]);
if (nxt[i])
update(nxt[i], v[i]);
ptr+= 1; }
ans[sir[i].idx] = query(sir[i].d); }
for (int i = 1; i <= m; ++i)
printf("%lld\n", ans[i]);
return 0; }