莫队

莫队

#define _CRT_SECURE_NO_WARNINGS
#define suro
#include <bits/stdc++.h>
using namespace std;
#ifndef suro
define endl '\n'
#endif
#define INF 0x7fffffff
#define inf 0x3f3f3f3f
    typedef long long LL;
#define int long long
const int N = 2e5 + 10;//M = 500;  // mod = 998244353;

int a[N];
array<int, 3> que[N];
int ans[N];
int cnt[N];
int n, m, tmp;
bool cmp(array<int, 3> a, array<int, 3> b) {
    if (a[0] / M != b[0] / M)
        return a[0] / M < b[0] / M;
    else {
        if ((a[0] / M) & 1)
            return a[1] < b[1];
        else
            return a[1] > b[1];
    }
}
auto add(int i) {
    tmp += cnt[a[i]] * (cnt[a[i]] - 1) / 2;
    cnt[a[i]]++;
}
auto del(int i) {
    cnt[a[i]]--;
    tmp -= cnt[a[i]] * (cnt[a[i]] - 1) / 2;
}
void solve() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= m; i++) {
        int l, r;
        cin >> l >> r;
        que[i] = {l, r, i};
    }
    sort(que + 1, que + m + 1, cmp);
    int l = 1, r = 0;
    tmp = 0;
    for (int i = 1; i <= m; i++) {
        while (r < que[i][1]) {
            add(++r);
        }
        while (l > que[i][0]) {
            add(--l);
        }
        while (r > que[i][1]) {
            del(r--);
        }
        while (l < que[i][0]) {
            del(l++);
        }
        ans[que[i][2]] = tmp;
    }
    for (int i = 1; i <= m; i++) {
        cout << ans[i] << endl;
    }
}
signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);

    int T;
    // std::cin >> T;
    T = 1;
    while (T--) {
        solve();
    }
#ifdef suro
    system("pause");
#endif
    return 0;
}

Last updated