void _work(int x, int w)
{
ans -= cnt[x] * (cnt[x] - 1) / 2;
cnt[x] += w;
ans += cnt[x] * (cnt[x] - 1) / 2;
}
void work(int x,int w)
{
ans -= cnt[a[x]] * (cnt[a[x]] - 1) / 2;
cnt[a[x]] += w;
ans += cnt[a[x]] * (cnt[a[x]] - 1) / 2;
}
while (r < q[j].r) work(a[++r], 1);
while (r > q[j].r) work(a[r--], -1);
while (l < q[j].l) work(a[l++], -1);
while (l > q[j].l) work(a[--l], 1);
while (r < q[j].r) work(++r, 1);
while (r > q[j].r) work(r--, -1);
while (l < q[j].l) work(l++, -1);
while (l > q[j].l) work(--l, 1);
请问上面的做法与下面的有何不同,上面的可过