#include #include #include #include #include #include #include #include #include using namespace std; int n,m; const int maxn=300005; int parent[maxn]; int Find(int x){//查找+非递归的路径压缩 int p = x; while( parent[p] > 0 ) p = parent[p]; while( x != p ){ int temp = parent[x]; parent[x] = p; x = temp; } return x; } void Union(int r1, int r2){ int a = Find(r1); int b = Find(r2); if( a == b ) return ; //加权规则合并 if( parent[a] < parent[b] ){ parent[a] += parent[b]; parent[b] = a; } else { parent[b] += parent[a]; parent[a] = b; } } struct edge { int x,y,w; }e[300005]; bool f[32]; __int64 p[32]; bool check(int w) { for(int i=0;i=w;i--) if(f[i]) t+=p[i]; for(int i=0;i1) return 0; return 1; } void dfs(int p) { if(p==0) return; f[p]=1; if(!check(p)) f[p]=0; dfs(p-1); } int main() { p[1]=1; for(int i=2;i<32;i++) p[i]=p[i-1]*2; int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i=1;i--) if(f[i]) t+=p[i]; printf("%I64d\n",t); } return 0; }