1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| struct BIT2D {
ll tr[maxn][maxm]; int n, m; void init( int N, int M ) { n = N, m = M; for( int i = 0; i <= n; ++ i ) fill( tr[i], tr[i] + m + 1, 0 ); }
void add( int x, int y, ll val ) { for( int i = x; i <= n; i += i & -i ) for( int j = y; j <= m; j += j & -j ) tr[i][j] += val; }
ll ask( int x, int y ) { ll res = 0; for( int i = x; i; i -= i & -i ) for( int j = y; j; j -= j & -j ) res += tr[i][j]; return res; }
ll ask( int x1, int y1, int x2, int y2 ) { return ask( x2, y2 ) - ask( x1 - 1, y2 ) - ask( x2, y1 - 1 ) + ask( x1 - 1, y1 - 1 ); }
} bit[101];
int col[maxn][maxm];
void solve( ) { int n = read( ), m = read( );
for( int c = 1; c <= 100; ++ c ) { bit[c].init( n, m ); }
for( int i = 1; i <= n; ++ i ) { for( int j = 1; j <= m; ++ j ) { col[i][j] = read( ); bit[col[i][j]].add( i, j, 1 ); } }
int q = read( ); for( int i = 1; i <= q; ++ i ) { int opt = read( );
if( opt == 1 ) { int x = read( ), y = read( ); int c = read( ); int color = col[x][y]; bit[color].add( x, y, -1 ); bit[c].add( x, y, 1 ); col[x][y] = c; } else { int x1 = read( ), x2 = read( ); int y1 = read( ), y2 = read( ); int c = read( ); ll ans = bit[c].ask( x1, y1, x2, y2 ); cout << ans << '\n'; } } }
|