1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| struct qury { int l, r, id; };
void solve() { int n, m, k; cin >> n >> m >> k; vi nums(n + 1); for (int i = 1; i <= n; i++) { cin >> nums[i]; } vi cnt(k + 3); vector<qury> qry(m);
for (int i = 0; i < m; i++) { cin >> qry[i].l >> qry[i].r; qry[i].id = i; } int bk = max(1, (int)sqrt(n)); sort(all(qry), [&](qury a, qury b) { int aa=a.l/bk; int bb=b.l/bk; if(aa!=bb)return aa<bb; else { return a.r<b.r; } });
int now = 0; auto add = [&](int x) -> void { now += 2 * cnt[nums[x]] + 1; cnt[nums[x]]++; }; auto del = [&](int x) -> void { now -= 2 * cnt[nums[x]] - 1; cnt[nums[x]]--; };
int lef = 1; int ri = 0; vi anss(m); ll ans = 0; for (int i = 0; i < m; i++) { while (lef > qry[i].l) { lef--; add(lef); }
while (ri < qry[i].r) { ri++; add(ri); }
while (lef < qry[i].l) { del(lef); lef++; }
while (ri > qry[i].r) { del(ri); ri--; }
anss[qry[i].id] = now; } for (int i = 0; i < m; i++) { cout << anss[i] << '\n'; } }
|