"use strict";
    
const main = arg => {
  // とりあえず切り分け
  let Nums = arg.split("\n");
  // 1行目だけ特別なので取り出す
  let baseInfo = Nums.shift(0);
  let W = baseInfo.split(" ")[0]*1;
  let H = baseInfo.split(" ")[1]*1;
  // 各要素ごとの配列を作る
  let xMin = new Set();
  let xMax = new Set();
  let yMin = new Set();
  let yMax = new Set();
  // そこからケース分でより分ける;
  Nums.forEach(arr=>{
	let m = arr.split(" ")[2]*1;
    // 各要素を切り出して配列を作成
    switch(m){
      case 1:
		xMin.add(arr.split(" ")[0]*1);
        break;
      case 2:
        // 最大値がWと一致する場合のフィルタをここに記述
        if(arr.split(" ")[0] != W){
			xMax.add(arr.split(" ")[0]*1);
        }
        break;
      case 3:
		yMin.add(arr.split(" ")[1]*1);
        break;
      case 4:
        if(arr.split(" ")[1] != H){
			yMax.add(arr.split(" ")[1]*1);
        }
        break;
    }
  })
  // それぞれの配列でsortかけて必要な値を出す
  let xMinNum = xMin.size !== 0? Math.min(...xMin): 0;
  let xMaxNum = xMax.size !== 0? Math.max(...xMax):	0;
  let yMinNum = yMin.size !== 0? Math.min(...yMin): 0;
  let yMaxNum = yMax.size !== 0? Math.max(...yMax): 0;
  // 最小値と最大値の値が単独で塗りつぶすことも配慮する必要あり
  let xIsOver = (xMinNum > xMaxNum) || (xMinNum >= W) ||(xMaxNum <= 0);
  let yIsOver = (yMinNum > yMaxNum) || 　(yMinNum >= H) ||(yMaxNum <= 0);;
  // 面積
  // xとyを端に寄せるようなイメージ 
  let newX = (xMinNum!=0 || xMaxNum!=0)? xMinNum + (W - xMaxNum):0;
  let newY = (yMinNum!=0 || yMaxNum!=0)? yMinNum + (H - yMaxNum):0;
  let alea = (xIsOver || yIsOver)? 0 : W*H - newX*H - newY*W + newX*newY;
  console.log(alea)
}

main(require('fs').readFileSync('/dev/stdin', 'utf8'));
