Pagini recente » Cod sursa (job #977461) | Cod sursa (job #1880332) | Cod sursa (job #10993) | Cod sursa (job #29487) | Cod sursa (job #2456936)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = 666013;
int add(int a, int b) {
a += b;
if (a >= mod) {
return a - mod;
}
if (a < 0) {
return a + mod;
}
return a;
}
const int N = 100000 + 7;
int n, k, m;
int a[N], f[N];
int bucket;
struct segment {
int l;
int r;
int i;
};
bool operator < (segment a, segment b) {
if (a.l / bucket == b.l / bucket) {
return a.r < b.r;
}
return a.l < b.l;
}
segment b[N];
int ans[N], sum;
void add(int x) {
x = a[x];
f[x]++;
if (f[x] == 1) {
sum = add(sum, x);
}
}
void del(int x) {
x = a[x];
f[x]--;
if (f[x] == 0) {
sum = add(sum, -x);
}
}
int l = 1, r = 1;
void bring_l(int lp) {
while (l < lp) {
del(l++);
}
while (lp < l) {
add(--l);
}
}
void bring_r(int rp) {
while (r < rp) {
add(++r);
}
while (r > rp) {
del(r--);
}
}
int main() {
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", &a[i]);
}
for (int i = 1; i <= m; i++) {
scanf("%d %d", &b[i].l, &b[i].r);
b[i].i = i;
}
while ((bucket + 1) * (bucket + 1) <= m) {
bucket++;
}
bucket = n / bucket;
sort(b + 1, b + m + 1);
add(1);
for (int i = 1; i <= m; i++) {
bring_l(b[i].l);
bring_r(b[i].r);
bring_l(b[i].l);
ans[b[i].i] = sum;
}
for (int i = 1; i <= m; i++) {
printf("%d\n", ans[i]);
}
return 0;
}