#include #define N 1005 using namespace std; int n; struct node{ int l,r; }Q[N]; inline void Rd(int &res){ char c;res=0; while(c=getchar(),c<48); do res=(res<<3)+(res<<1)+(c^48); while(c=getchar(),c>47); return; } int dp[N][9],pos[N][9],cnt[N]; int solve(){ int res=2e9; memset(dp,63,sizeof(dp)); if(Q[1].l==Q[1].r)cnt[1]=1,pos[1][1]=Q[1].l; else{ cnt[1]=4; pos[1][1]=Q[1].l; pos[1][2]=Q[1].l+1; pos[1][3]=Q[1].r-1; pos[1][4]=Q[1].r; } for(int i=1;i<=cnt[1];i++)dp[1][i]=0; for(int i=2;i<=n;i++){ int l=1,r=1e6; if(Q[i].l==Q[i].r)cnt[i]=1,pos[i][1]=Q[i].l; else{ cnt[i]=4; pos[i][1]=Q[i].l; pos[i][2]=Q[i].l+1; pos[i][3]=Q[i].r-1; pos[i][4]=Q[i].r; } for(int j=i-1;j>=1;j--){ for(int k=1;k<=cnt[i];k++){ for(int p=1;p<=cnt[j];p++){ int id=pos[j][p]; if(l<=id&&id<=r){ dp[i][k]=min(dp[i][k],dp[j][p]+(abs(id-pos[i][k])+1)/2); } } } l=max(l,Q[j].l);r=min(r,Q[j].r); if(l>r)break; } if(l<=r){ for(int j=1;j<=cnt[i];j++){ int id=pos[i][j]; if(l<=id&&id<=r)dp[i][j]=0; else dp[i][j]=min(dp[i][j],min((abs(id-l)+1)/2,(abs(id-r)+1)/2)); } } // for(int j=1;j<=cnt[i];j++){ // printf("!!%d %d %d\n",i,j,dp[i][j]); // } } int l=1,r=1e6; for(int i=n;i>=1;i--){ for(int j=1;j<=cnt[i];j++){ int id=pos[i][j]; if(l<=id&&id<=r)res=min(res,dp[i][j]); } l=max(l,Q[i].l);r=min(r,Q[i].r); if(l>r)break; } return res; } int main(){ int T; Rd(T); while(T--){ Rd(n); for(int i=1;i<=n;i++)Rd(Q[i].l),Rd(Q[i].r); printf("%d\n",solve()); } return 0; }