import java.util.*; import java.awt.*; import java.awt.geom.*; import java.io.*; public class C { public static void main(String[] args)throws Exception { BufferedReader r = new BufferedReader (new FileReader("area.txt")); while(true) { int l = Integer.parseInt(r.readLine()); if(l == 0)break; int maxX = -3000; int maxY = -3000; int minX = 3000; int minY = 3000; Polygon po = new Polygon(); for(int i = 0; i < l;i++) { StringTokenizer st = new StringTokenizer(r.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); if(x < minX)minX = x; if(y < minY)minY = y; if(x > maxX)maxX = x; if(y > maxY)maxY = y; po.addPoint(x,y); } int ans = 0; /* int[][] table = new int[maxX-minX][maxY-minY]; for(int i = 0;i < maxX-minX;i++) table[i] = new int[maxY-minY]; for(int i = 0;i < maxX-minX;i++) for(int j = 0;j < maxY-minY;j++) table[i][j] = 0; */ /* for(int i = minX;i < maxX;i++) for(int j = minY;j < maxY;j++) { //if(po.intersects(new Rectangle2D.Double(i,j,1,1))) //if(po.intersects(i,j,1,1)) if(po.contains(i+0.5,j+0.5)) { ans++; //table[][] } else { if(po.intersects(i,j,1,1)) ans++; } } */ ans = loop(po,minX,minY,maxX,maxY); System.out.println(ans); } } static int loop(Polygon p,int x,int y,int ex,int ey) { if(x == ex || y == ey)return 0; if(x == ex-1 && y == ey-1) { if(p.intersects(x,y,1,1)) return 1; else return 0; } if(p.contains(x,y,ex-x,ey-y)) return (ex-x)*(ey-y); if(p.intersects(x,y,ex-x,ey-y)) // else { int xx = (x + ex) / 2; int yy = (y + ey) / 2; int t = 0; t += loop(p,x,y,xx,yy); t += loop(p,xx,y,ex,yy); t += loop(p,x,yy,xx,ey); t += loop(p,xx,yy,ex,ey); return t; } return 0; } }