using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
	class Program
	{
		struct polje1
		{
			public int i;
			public int j;
		}
		static void Main(string[] args)
		{
			Stack<polje1> st = new Stack<polje1>();
			string[] s = Console.ReadLine().Split();
			int n = int.Parse(s[0]), m = int.Parse(s[1]), d = int.Parse(s[2]);
			int[,] tabla = new int[n, m];
			for (int i = 0; i < d; i++)
			{
				s = Console.ReadLine().Split();
				tabla[int.Parse(s[0]) - 1, int.Parse(s[1]) - 1] = 1;
			}
			polje1 polje = new polje1();
			int br = 0, r, k;
			for (int i = 0; i < n; i++)
			{
				for (int j = 0; j < m; j++)
				{
					if (tabla[i, j] == 0)
					{
						polje.i = i; polje.j = j; st.Push(polje);
						while(st.Count>0)
						{
							polje = st.Pop(); r = polje.i; k = polje.j; tabla[r, k] = 1;
							if (r > 0 && tabla[r - 1, k] == 0)
							{
								polje.i = r - 1; polje.j = k; st.Push(polje);
							}
							if (r < n - 1 && tabla[r + 1, k] == 0)
							{
								polje.i = r + 1; polje.j = k; st.Push(polje);
							}
							if (k > 0 && tabla[r, k - 1] == 0)
							{
								polje.i = r; polje.j = k - 1; st.Push(polje);
							}
							if (k < m - 1 && tabla[r, k + 1] == 0)
							{
								polje.i = r; polje.j = k + 1; st.Push(polje);
							}
						}
						br++;
					}
				}
			}
			Console.WriteLine(br);
		}
	}
}