#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
struct Node {
int l, r, bl, id;
} q[N];
bool cmp(const Node &a, const Node &b) {
if(a.bl == b.bl) return a.r < b.r;
return a.bl < b.bl;
}
int blo, n, m, a[N];
long long ans = 0, xd[N], sum[N];
void modify(int x, int d) {
if(sum[x] != 2) ans -= (long long) x * sum[x];
sum[x] += d;
ans += (long long) x * sum[x];
if(sum[x] == 2) ans -= (long long) sum[x] * x;
}
int main() {
freopen("abnormal.in", "r", stdin);
freopen("abnormal.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
int blo = (int)sqrt(n);
for(int i = 1; i <= m; i ++) {
scanf("%d %d", &q[i].l, &q[i].r);
q[i].bl = (q[i].l - 1) / blo + 1; q[i].id = i;
}
sort(q + 1, q + m + 1, cmp);
int l = 0, r = 0;
for(int i = 1; i <= m; i ++) {
while(q[i].l > l) modify(a[l], -1), l ++;
while(q[i].l < l) modify(a[l - 1], 1), l --;
while(q[i].r > r) modify(a[r + 1], 1), r ++;
while(q[i].r < r) modify(a[r], -1), r --;
xd[q[i].id] = ans;
}
for(int i = 1; i <= m; i ++)
printf("%I64d\n", xd[i]);
return 0;
}
【NOIP模板】 莫队(分块)
最新推荐文章于 2023-01-18 17:54:34 发布