Pagini recente » Cod sursa (job #1187113) | Cod sursa (job #1351931) | Cod sursa (job #182316) | Cod sursa (job #1020144) | Cod sursa (job #551032)
Cod sursa(job #551032)
#include <cstdio>
#include <algorithm>
#define f first
#define s second
using namespace std;
const int N = 100005;
int n, m, a[N], l[N], aib[N], v[N], k;
struct tip{int f, s, o;} q[N];
int cmp(tip a, tip b) {
return a.s < b.s;
}
void update(int x, int val) {
for(;x <= n; x += (x ^ (x - 1)) & x)
aib[x] += val;
}
int query(int x) {
int s = 0;
for(;x; x -= (x ^ (x - 1)) & x)
s += aib[x];
return s;
}
int main() {
freopen("distincte.in", "r", stdin);
freopen("distincte.out", "w", stdout);
int i;
scanf("%d %d %d", &n, &k, &m);
for(i = 1; i <= n; ++i)
scanf("%d", &a[i]);
for(i = 1; i <= m; ++i)
scanf("%d %d", &q[i].f, &q[i].s), q[i].o = i;
for(i = 1; i <= n; ++i) {
l[i] = v[a[i]];
v[a[i]] = i;
}
sort(q + 1, q + m + 1, cmp);
for(i = 1; i <= m; ++i) {
if(l[i]) {
update(l[i], - a[i]);
update(i, a[i]);
}
if(i == q[i].s)
v[q[i].o] = query(q[i].s) - query(q[i].f - 1);
}
for(i = 1; i <= m; ++i)
printf("%d\n", v[i]);
return 0;
}