Pagini recente » Cod sursa (job #2714974) | Cod sursa (job #1917992) | Cod sursa (job #305583) | Cod sursa (job #163796) | Cod sursa (job #2304667)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100005;
struct Secv {
int ind, st, dr;
};
Secv s[NMAX];
int v[NMAX];
long long sol[NMAX];
long long aib[NMAX];
int p[NMAX];
bool cmp(Secv first, Secv second) {
return first.dr < second.dr;
}
void update(int n, int poz, int val) {
while(poz <= n) {
aib[poz] += val;
poz += poz&(-poz);
}
}
long long query(int poz) {
long long ans = 0;
while(poz) {
ans += aib[poz];
poz -= poz&(-poz);
}
return ans;
}
int main() {
int n, k, m;
freopen("distincte.in", "r", stdin);
freopen("distincte.out", "w", stdout);
scanf("%d%d%d", &n, &k, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
}
for(int i = 1; i <= m; i++) {
s[i].ind = i;
scanf("%d%d", &s[i].st, &s[i].dr);
}
sort(s + 1, s + m + 1, cmp);
int j = 1;
for(int i = 1; i <= n; i++) {
int val = v[i];
if(p[val]) {
update(n, p[val], -val);
}
update(n, i, val);
while(j <= m && s[j].dr == i) {
long long sol1 = query(i);
long long sol2 = query(s[j].st - 1);
sol[s[j].ind] = sol1 - sol2;
j++;
}
p[val] = i;
}
for(int i = 1; i <= m; i++) {
printf("%lld\n", sol[i]);
}
return 0;
}