You still have partial information about the score during the historic football match. You are given a set of pairs (a_i, b_i), indicating that at some point during the match the score was "a_i: b_i". It is known that if the current score is «x:y», then after the goal it will change to "x+1:y" or "x:y+1". What is the largest number of times a draw could appear on the scoreboard?

The pairs "a_i:b_i" are given in chronological order (time increases), but you are given score only for some moments of time. The last pair corresponds to the end of the match.

Input

The first line contains a single integer n (1 ≤ n ≤ 10000) — the number of known moments in the match.

Each of the next n lines contains integers a_i and b_i (0 ≤ a_i, b_i ≤ 10^9), denoting the score of the match at that moment (that is, the number of goals by the first team and the number of goals by the second team).

All moments are given in chronological order, that is, sequences x_i and y_j are non-decreasing. The last score denotes the final result of the match.

Output

Print the maximum number of moments of time, during which the score was a draw. The starting moment of the match (with a score 0:0) is also counted.

Examples

Input

3
2 0
3 1
3 4


Output

2


Input

3
0 0
0 0
0 0


Output

1


Input

1
5 4


Output

5

Note

In the example one of the possible score sequences leading to the maximum number of draws is as follows: 0:0, 1:0, 2:0, 2:1, 3:1, 3:2, 3:3, 3:4.
//package practice_codes;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;

//import codes.Reference.i;

public class Draw {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		long t;
		
		t = i.l();
		ArrayList<Pair> p = new ArrayList<Pair>(); 
		p.add(new Pair(0,0));
		//String s = i.s();
		while(t>0)
		{
			long a[]=i.la();
			p.add(new Pair(a[0],a[1]));
			t--;	
		}
		long cnt=1;
		for(int i=1;i<p.size();i++)
		{
			
			if(p.get(i).x==p.get(i-1).x && p.get(i).y==p.get(i-1).y)
			{
				continue;
			}
			long x1 = Math.max(p.get(i-1).x, p.get(i-1).y);
			long x2 = Math.min(p.get(i).x, p.get(i).y);
			cnt+=((x2-x1)<0?-1:(x2-x1))+1;
			if(p.get(i-1).x==p.get(i-1).y)
			{
				cnt--;
			}
			
		}
		System.out.println(cnt);
	}
	static private class i
	{
		//input taking methods
		static BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
		
		public static String[] sa()
	    {
	    	try {
				return b.readLine().split(" ");
			} catch (IOException e) {
				
				e.printStackTrace();
			}
	    	return null;
	    }
		
		public static long l()
		{
			try {
				return Long.parseLong(b.readLine());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    	return 0;
		}
		
		public static String s()
		{
			try {
				return b.readLine();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    	return null;
		}
		
		public static long[] la()
		{
			return Arrays.stream(sa()).parallel().mapToLong(Long::parseLong).toArray();
		}
		
		public static ArrayList<Long> lal()
		{
			return (ArrayList<Long>)Arrays.stream(la()).parallel().boxed().collect(Collectors.toList());
		}
		public static StringBuilder so(String a)
		{
			return new StringBuilder(a);
		}

	}
	/*
	 HashMap<String,Integer> map = new HashMap<String,Integer>();
	 if(!map.containsKey(key))
	 {
	 	map.put(key,value);
	 }
	 else
	 {
	 	map.replace(key,map.get(key));
	 } 
	 */
	static private class algo{
		
		public static boolean isPrime(int a)
		{
			for(int i=2;i<a;i++)
			{
				if(a%i==0)
				{
					return false;
				}
			}
			return true;
		}
		static String reverse(String s)
		{
			return i.so(s).reverse().toString();
		}
		static String replace(String s,int st,int e,String repl)
		{
			return i.so(s).replace(st, e, repl).toString();
		}
		static String insert(String s,int pos,String ins)
		{
			return i.so(s).insert(pos, ins).toString();
		}
		static long sod(long n) 
	    { 
	        long sum; 
	        for (sum = 0; n > 0; sum += n % 10, 
	                                  n /= 10); 
	  
	        return sum; 
	    } 

		static int gcd(int a, int b) 
	    { 
			if (a == 0) 
				return b;  
			return gcd(b % a, a);  
	    } 
		
	    static int lcm(int a, int b) 
	    { 
	        return (a*b)/gcd(a, b); 
	    }
	    static long sumOfSquares(long[] a)
	    {
	    	
	    	return (long) Arrays.stream(a).mapToDouble(i->i*i).sum();
	    }
	    //use of filter
	    //Arrays.stream(a).filter(k->k==1).count();
	    //            array       variable->condition returning boolean  . lot fof functionsa re available
	    
	    static String[] generateBinSeq(int cnt)
	    {
	    	int loopvar=(int) Math.pow(2, cnt);
			String a[][] = new String[cnt+1][loopvar];
			
			for(int i=1;i<=cnt;i++)
			{
				int temp = (int) Math.pow(2, i);
				for(int j=0;j<temp;j++)
				{
					if(i==1 || i==2)
					{
						if(i==1)
						{
							a[i][0]="0";
							a[i][1]="1";
							continue;
						}
						else
						{
							a[2][0]="00";a[2][1]="01";a[2][2]="10";a[2][3]="11";
							continue;
						}
					}
					else
					{
						if(j<(temp/2))
						{
							a[i][j] = a[i-1][j]+"0"; 
						}
						else
						{
							a[i][j] = a[i-1][j%((temp+1)/2)]+"1";
						}
				
					}
						
				}
			}
	    
			return a[cnt];
	    }
	    
	 // USe this snippet for calling
//	    int ndx = algo.bs(a,key,0,a.length-1);
//		if(ndx<0)
//			ndx=0;
//		if(ndx==a.length)
//			ndx=a.length-1;

	    static public int bs(long a[],long key,int s,int e)
		{
			int m = (s+e)/2;
			if(s>e)
				return s;
				
			if(a[m]==key)
				return m;
			else if(a[m]>key)
				return bs(a,key,s,m-1);
			else
				return bs(a,key,m+1,e);
			
		}
	 // USe this snippet for calling
//	    int ndx = bsa(al,key,0,al.size()-1);
//		if(ndx<0)
//			ndx=0;
//		if(ndx==al.size())
//			ndx=al.size()-1;
	    static public int bsa(ArrayList<Long> a,long key,int s,int e)
		{
			int m = (s+e)/2;
			if(s>e)
				return s;
				
			if(a.get(m)==key)
				return m;
			else if(a.get(m)>key)
				return bsa(a,key,s,m-1);
			else
				return bsa(a,key,m+1,e);
			
		}
	    static public long fact(long a)
	    {
	    	long i,fact=1;  
	    	 long number=a;   
	    	  for(i=1;i<=number;i++){    
	    	      fact=fact*i;    
	    	  } 
	    	  return fact;
	    }
	    
	}
}
class Pair{
	long x;
	long y;
	public Pair(long x, long y) {
		this.x = x;
		this.y = y;
	}
	
}
