#include #include //sort,二分探索,など #include //固定長bit集合 #include //pow,logなど #include //複素数 #include //両端アクセスのキュー #include //sortのgreater #include //setprecision(浮動小数点の出力の誤差) #include //入出力 #include //集合演算(積集合,和集合,差集合など) #include //map(辞書) #include //iota(整数列の生成),gcdとlcm(c++17) #include //キュー #include //集合 #include //スタック #include //文字列 #include //イテレータあるけど順序保持しないmap #include //イテレータあるけど順序保持しないset #include //pair #include //可変長配列 using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef vector vi; typedef vector vll; typedef vector vs; typedef vector vb; typedef vector> vvi; typedef vector> vvll; typedef vector> vvs; typedef vector> vvb; const ll MOD = 1000000007; const ll INF = 1000000000000000000; #define rep(i,n) for(int i=0;i=0;i--) #define all(x) (x).begin(),(x).end() template inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int W, H, N; cin >> W >> H >> N; vi S(N), K(N); rep(i, N) cin >> S[i] >> K[i]; set S2, K2; rep(i, N) { S2.insert(S[i]); K2.insert(K[i]); } ll ans = 0; //包除原理で解く //手札のマークと数字を独立して1つの制約として扱う //同じ種類(マーク・数字)の制約は2個以上両立しないので //以下3パターンを考えればよい //1.マーク1つ //2.数字1つ //3.マーク1つと数字1つ //1. ans += S2.size() * H; //2. ans += K2.size() * W; //3. //マーク1つと数字1つを指定するとカードが1枚決まる ans -= S2.size() * K2.size(); //手札を除く cout << ans - N << endl; return 0; }