Pagini recente » Cod sursa (job #876215) | Cod sursa (job #262070) | Cod sursa (job #2160865) | Cod sursa (job #902184) | Cod sursa (job #2159404)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
ifstream cin ("distincte.in");
ofstream cout ("distincte.out");
struct Q {
int l, r, index;
};
void ExtendRR (int &r, int targetR, vector < int > &v, vector < int > &frecv, long long &sum) {
while (r < targetR) {
++ r;
if (++ frecv[v[r]] == 1) {
sum += v[r];
}
}
}
void ExtendRL (int &r, int targetR, vector < int > &v, vector < int > &frecv, long long &sum) {
while (r > targetR) {
if (-- frecv[v[r]] == 0) {
sum -= v[r];
}
-- r;
}
}
void ExtendLR (int &l, int targetL, vector < int > &v, vector < int > &frecv, long long &sum) {
while (l < targetL) {
if (-- frecv[v[l]] == 0) {
sum -= v[l];
}
++ l;
}
}
void ExtendLL (int &l, int targetL, vector < int > &v, vector < int > &frecv, long long &sum) {
while (l > targetL) {
-- l;
if (++ frecv[v[l]] == 1) {
sum += v[l];
}
}
}
int main () {
int n, k, m;
cin >> n >> k >> m;
vector < int > v (n + 1);
vector < int > frecv (k + 1);
for (int i = 1; i <= n; ++ i) {
cin >> v[i];
}
vector < Q > q (m + 1);
vector < long long > ans (m + 1);
for (int i = 1; i <= m; ++ i) {
cin >> q[i].l >> q[i].r;
q[i].index = i;
}
int sq = sqrt (n);
sort (q.begin () + 1, q.end (), [&sq] (Q a, Q b) -> bool {
int la = (a.r - a.l) / sq;
int lb = (b.r - b.l) / sq;
if (la != lb) {
return la < lb;
}
return a.r < b.r;
});
long long sum = 0;
int left_end = 1, right_end = 0;
for (int i = 1; i <= m; ++ i) {
ExtendLL (left_end, q[i].l, v, frecv, sum);
ExtendLR (left_end, q[i].l, v, frecv, sum);
ExtendRL (right_end, q[i].r, v, frecv, sum);
ExtendRR (right_end, q[i].r, v, frecv, sum);
ans[q[i].index] = sum;
}
for (int i = 1; i <= m; ++ i) {
cout << ans[i] << '\n';
}
}