容斥裸题

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e4 + 10;
const int INF = 0x3f3f3f3f;
int T, n, m, k;
int x[maxn], y[maxn];
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d %d %d", &n, &m, &k);
for (int i = 0; i < k; i++) scanf("%d %d", &x[i], &y[i]);
long long ans = 0;
for (int t = 1; t < (1<<k); t++) {
int cnt = 0, minx = INF, maxx = -INF, miny = INF, maxy = -INF;
for (int i = 0; i < k; i++) {
if (t & (1<<i)) {
cnt++;
minx = min(minx, x[i]);
maxx = max(maxx, x[i]);
miny = min(miny, y[i]);
maxy = max(maxy, y[i]);
}
}
long long res = (long long)minx*(n-maxx+1)*miny*(m-maxy+1);
if (cnt & 1) ans += res;
else ans -= res;
}
cout << (long long)n*(n+1)/2*m*(m+1)/2 - ans << endl;
}
return 0;
}