Pagini recente » Cod sursa (job #3173774) | Cod sursa (job #1632760) | Cod sursa (job #2241553) | Cod sursa (job #836956) | Cod sursa (job #2246351)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distincte.in");
ofstream fout("distincte.out");
const int kMax = 100001;
int n, k, m, bucket, x[kMax];
int f[kMax], result[kMax];
struct data {
int left, right, ind;
} v[kMax];
bool comp(data a, data b) {
if (a.left / bucket != b.left / bucket)
return (a.left / bucket) < (b.left / bucket);
return a.right < b.right;
}
int main() {
fin >> n >> k >> m;
bucket = (int)sqrt(n);
for (int i = 1; i <= n; i++)
fin >> x[i];
for (int i = 0; i < m; i++) {
fin >> v[i].left >> v[i].right;
v[i].ind = i;
}
sort(v, v + m, comp);
int absLeft = v[0].left, absRight = v[0].right, sum = 0;
for (int i = absLeft; i <= absRight; i++) {
f[x[i]]++;
if (f[x[i]] == 1)
sum += x[i];
}
result[v[0].ind] = sum;
for (int i = 1; i < m; i++) {
int left = v[i].left;
int right = v[i].right;
while (absLeft < left) {
if (f[x[absLeft]] > 0)
f[x[absLeft]]--;
if (f[x[absLeft]] == 0)
sum -= x[absLeft];
absLeft++;
}
while (absLeft > left) {
f[x[absLeft-1]]++;
if (f[x[absLeft-1]] == 1)
sum += x[absLeft-1];
absLeft--;
}
while (absRight <= right) {
f[x[absRight]]++;
if (f[x[absRight]] == 1)
sum += x[absRight];
absRight++;
}
while (absRight > right + 1) {
f[x[absRight-1]]++;
if (f[x[absRight-1]] == 1)
sum -= x[absRight];
absRight--;
}
result[v[i].ind] = sum;
}
for (int i = 0; i < m; i++)
fout << result[i] << '\n';
fin.close();
fout.close();
return 0;
}