#include <bits/stdc++.h> using namespace std; const int maxn = 1e6+10; #define pb push_back #define fi first #define se second #define pii pair<int, int> #define mp(a, b) make_pair(a, b) int n, m, k; vector<int> bit[maxn]; vector<pii> plant[maxn]; int low_bit(int x){ return x&(-x); } void add(int x, int y, int val){ for(int i=x; i<=n; i+=low_bit(i)){ for(int j=y; j<=m; j+=low_bit(j)){ bit[i][j] += val; } } return ; } int query(int x, int y){ int ans = 0; for(int i=x; i>0; i-=low_bit(i)){ for(int j=y; j>0; j -= low_bit(j)){ ans += bit[i][j]; } } return ans; } struct Query{ int x1, y1, x2, y2, k; }q[maxn]; bool cmp(Query a, Query b){ return a.k<b.k; } int main(){ scanf("%d%d%d", &n, &m, &k); for(int i=0; i<n+2; i++){ bit[i].resize(m+2); plant[i].resize(m+2); } for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ int kind; scanf("%d", &kind); plant[kind].pb(mp(i, j)); } } int x1, y1, x2, y2, c; for(int i=1; i<=k; i++){ scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c); q[i].x1=x1, q[i].y1=y1, q[i].x2=x2, q[i].y2=y2, q[i].k=c; add(x1, y1, 1); add(x2+1, y2+1, 1); add(x1, y2+1, -1); add(x2+1, y1, -1); } int i, j, zz; sort(q+1, q+k+1, cmp); int ans = 0; for(int i=1, j=1; i<=n*m; i++){ while(q[j].k<i&&j<=k) j++; if(plant[i].size() == 0) continue; zz = j; while(q[zz].k==i&&zz<=k) zz++; for(int ii=j; ii<zz; ii++){ add(q[ii].x1, q[ii].y1, -1); add(q[ii].x2+1, q[ii].y2+1, -1); add(q[ii].x1, q[ii].y2+1, 1); add(q[ii].x2+1, q[ii].y1, 1); } for(int ii=0; ii<plant[i].size(); ii++){ if(query(plant[i][ii].fi, plant[i][ii].se)){ ans++; } } for(int ii=j; ii<zz; ii++){ add(q[ii].x1, q[ii].y1, 1); add(q[ii].x2+1, q[ii].y2+1, 1); add(q[ii].x1, q[ii].y2+1, -1); add(q[ii].x2+1, q[ii].y1, -1); } j=zz; } printf("%d\n", ans); return 0; }
|