对二维树状数组实现的疑问
查看原帖
对二维树状数组实现的疑问
1026365
yb_10032楼主2024/10/25 21:43
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 310;
const int V = 110;
ll n, m, q;
ll a[N][N];
struct Fenwick
{
    ll bit[N][N];
    inline ll lowbit(ll x)
    {
        return x & (-x);
    }
    inline void add(ll x, ll y, ll k)
    {
        x++, y++;
        for (ll i = x; i <= n; i += lowbit(i))
            for (ll j = y; j <= m; j += lowbit(j))
                bit[i][j] += k;
    }
    inline ll query(ll x, ll y)
    {
        x++, y++;
        ll ans = 0;
        for (ll i = x; i; i -= lowbit(i))
            for (ll j = y; j; j -= lowbit(j))
                ans += bit[i][j];
        return ans;
    }
    inline ll query(ll x1, ll x2, ll y1, ll y2)
    {
        return query(x2, y2) - query(x1 - 1, y2) - query(x2, y1 - 1) + query(x1 - 1, y1 - 1);
    }
} t[V];
int main(int argc, char const *argv[])
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    cin >> n >> m;
    for (ll i = 1; i <= n; i++)
        for (ll j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            t[a[i][j]].add(i, j, 1);
        }
    cin >> q;
    while (q--)
    {
        ll opt, x, y, x1, y1, x2, y2, c;
        cin >> opt;
        if (opt == 1)
        {
            cin >> x >> y >> c;
            t[a[x][y]].add(x, y, -1);
            a[x][y] = c;
            t[c].add(x, y, 1);
        }
        else
        {
            cin >> x1 >> x2 >> y1 >> y2 >> c;
            cout << t[c].query(x1, x2, y1, y2) << endl;
        }
    }
    system("pause");
    return 0;
}
2024/10/25 21:43
加载中...