1 // 多校6 1010 HDU5802 Windows 10
2 // 题意:从p到q有三种操作,要么往上升只能1步,要么往下降,如果连续往下降就是2^n,
3 // 中途停顿或者向上,下次再降的时候从1开始。问最少次数
4 // 思路:
5 // 1.下么一直往下降,到q的下方,然后再往上升。
6 // 2.或者往下降到离q最近的一个点再停顿一下 然后继续往下降
7 // 第一种的时候,上升的时候要减去之前停顿的次数,也就是说我可以提前上升一格,不用停顿。
8 // 应为上升一格的话,一定是要往上一格
9
10
11 #include <bits/stdc++.h>
12 using namespace std;
13 typedef long long LL;
14 LL dfs(LL p,LL q,LL stop,LL ans){
15 if(p==q) return ans;
16 LL cnt=0;
17 while(p-(1<<cnt)+1>q) cnt++;
18 if(p-(1<<cnt)+1==q) return ans+cnt;
19 LL dis=q-max(0LL,(LL)p-(1<<cnt)+1);
20 LL tem=cnt+max(0LL,dis-stop);
21 return min(tem+ans,dfs(p-(1<<(cnt-1))+1,q,stop+1,ans+cnt));
22 }
23 int main(){
24 int T;
25 scanf("%d",&T);
26 while(T--){
27 LL p,q;
28 scanf("%I64d%I64d",&p,&q);
29 if(p<=q){
30 printf("%I64d\n",q-p);
31 continue;
32 }
33 else{
34 LL ans=dfs(p,q,0,0);
35 printf("%I64d\n",ans);
36 }
37 }
38 return 0;
39 }