Pagini recente » Cod sursa (job #3364248) | Cod sursa (job #3360199) | Cod sursa (job #3364221) | Cod sursa (job #3360187) | Cod sursa (job #3364216)
#include <bits/stdc++.h>
#define MAXN 100000
#define MAXQ 100000
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
struct elem{
int st, dr, pos;
} query[MAXQ];
int aib[MAXN + 1], v[MAXN + 1], last[MAXN + 1], rez[MAXQ + 1];
int cmp(elem A, elem B){
return A.dr < B.dr;
}
int lsb(int x){
return x & -x;
}
void update(int n, int pos, int val){
while(pos <= n){
aib[pos] += val;
pos += lsb(pos);
}
}
int f_query(int pos){
int rez = 0;
while(pos > 0){
rez += aib[pos];
pos -= lsb(pos);
}
return rez;
}
int main()
{
int n, q, k, i, cur;
fin >> n >> k >> q;
for(i = 1; i <= n; i++){
fin >> v[i];
}
for(i = 1; i <= q; i++){
fin >> query[i].st >> query[i].dr;
query[i].pos = i;
}
sort(query + 1, query + q + 1, cmp);
cur = 1;
for(i = 1; i <= n; i++){
update(n, last[v[i]] + 1, v[i]);
update(n, i + 1, -v[i]);
last[v[i]] = i;
// printf("i = %d, cur = %d, q.dr = %d\n", i, cur, query[cur].dr);
while(cur <= q && query[cur].dr == i){
// printf("cur = %d, i = %d\n", cur, i);
rez[query[cur].pos] = f_query(query[cur].st);
cur++;
}
}
for(i = 1; i <= q; i++){
fout << rez[i] << "\n";
}
return 0;
}