分块求调
查看原帖
分块求调
761491
Zzzcr楼主2023/7/5 14:11
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define drep(i, a, b) for (int i = a; i >= b; --i)
const int N = 30005, S = 200;
int n, a[N], m, d[N], L[S], R[S], num, s, bl[N], l, r, k;
signed main()
{
    ios::sync_with_stdio(0);
    cin >> n, s = (int)sqrt(n);
    int num = n / s + !!(n % s);
    rep(i, 1, n) cin >> a[i], bl[i] = (i - 1) / s + 1;
    memcpy(d, a, sizeof a);
    rep(i, 1, num) L[i] = (i - 1) * s + 1, R[i] = i * s;
    R[num] = n;
    rep(i, 1, num) sort(d + L[i], d + R[i] + 1);
    cin >> m;
    while (m--)
    {
        int cnt = 0;
        cin >> l >> r >> k;
        rep(i, l, min(r, R[bl[l]])) if (a[i] > k) cnt++;
        if (bl[l] ^ bl[r])
            rep(i, L[bl[r]], r) if (a[i] > k) cnt++;
        rep(i, bl[l] + 1, bl[r] - 1)
            cnt += (R[i] + d - upper_bound(d + L[i], d + R[i], k) + 1);
        cout << cnt << '\n';
    }
    return 0;
}
2023/7/5 14:11
加载中...