Pagini recente » Cod sursa (job #2799601) | Cod sursa (job #1673413) | Cod sursa (job #3208599) | Cod sursa (job #3228244) | Cod sursa (job #2143924)
#include <stdio.h>
#include <algorithm>
using std::sort;
#define MAX_N 100000
#define aibSize MAX_N
typedef struct {
int x, y, init;
} cell;
int N, M, K;
int val[MAX_N + 1];
long long int aib[aibSize + 1];
long long int ans[MAX_N + 1];
int last[MAX_N + 1];
cell q[MAX_N + 1];
bool cmp(cell a, cell b) {
return a.y < b.y;
}
void add(int x, int val) {
do {
aib[x] += val;
x += x & -x;
} while (x <= aibSize);
}
long long int sum(int x) {
long long int s = 0;
while (x) {
s += aib[x];
x &= x - 1;
}
return s;
}
int main(void) {
FILE *f = fopen("distincte.in", "r");
int i;
fscanf(f, "%d %d %d", &N, &K, &M);
for (i = 1; i <= N; i++) {
fscanf(f, "%d", &val[i]);
}
for (i = 1; i <= M; i++) {
fscanf(f, "%d %d", &q[i].x, &q[i].y);
q[i].init = i;
}
fclose(f);
sort(q + 1, q + M + 1, cmp);
int ptr = 1;
for (i = 1; i <= N; i++) {
if (last[val[i]] == 0) {
last[val[i]] = i;
} else {
add(last[val[i]], -val[i]);
last[val[i]] = i;
}
add(i, +val[i]);
while (ptr <= M && q[ptr].y == i) {
ans[q[ptr].init] = sum(q[ptr].y) - sum(q[ptr].x - 1);
ptr++;
}
}
freopen("distincte.out", "w", stdout);
for (i = 1; i <= M; i++) {
fprintf(stdout, "%lld\n", ans[i]);
}
fclose(stdout);
return 0;
}