EOJ Monthly 2018.9 (based on Trial Round #3) B. 解密信件

B. 解密信件

Time limit per test: 1.0 seconds

Memory limit: 512 megabytes

oxx 总是喜欢给 ultmaster 写信,由于某些原因,这些信的内容又不能被人看见。但传信的过程中,信中信息的泄露又不可避免,于是 oxx 发明了一种信内容信息的加密方式。ultmaster 拿到了 oxx 的加密程序:

char letter[];

void encrypt(l, r) {
    if (l < r) {
        reverse letter[l..r];
        k = (r - l + 1) / 2;
        encrypt(l, l + k - 1);
        encrypt(l + k, r);
    }
}

其中 reverse letter[l..r] 是将 letter 从 l 到 r(闭区间)的子串倒置。

对于某个长度为 n,下标从 1 开始的字符串要进行加密,只要调用 encrypt(1, n) 即可。

由于 ultmaster 有超强的理解能力,所以 ultmaster 只需要知道信里面某些位置的信息,就能得知整封信的内容。而 oxx 写了太多的信给 ultmaster 。所以 ultmaster 会有 T 次询问,每一次询问其中一封信的一个位置 x,表示加密后的信里的位置,他想知道这个位置在加密前的信里是在什么位置。

众所周知,oxx 有很多话想说,所以信会很长很长。

Input

第一行一个整数 T (1≤T≤1 000),表示询问的个数。

接下来的 T 行,每行两个整数 n 和 x (1≤x≤n≤1018),表示信的长度和询问的位置。

Output

包含 T 行,每行一个整数,表示对于每一个询问的答案。

Examples

input

4
4 1
4 2
4 3
4 4

output

3
4
1
2

Note

样例解释:1234 → 43|21 → 3|4|1|2.

题解:

我好菜啊,递归的逆序都不会。

加密=区间对称位置+下溯,解密那不就是区间对称位置+pushup回溯么。

注意,T只有1000组询问,改区间虽然是o(nlogn),但该单点只需要o(logn),则总复杂度o(Tlogn)。

无需多想,就是一个pushdown和pushup的互逆操作。

#include <iostream>
#include <algorithm> 
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <bitset> 
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double eps=1e-7;
typedef long long ll;
#define vi vector<int> 
#define si set<int>
#define pii pair<int,int> 
#define pi acos(-1.0)
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a)) 
using namespace std;
void decrypt(ll l,ll r,ll &pos)
{
	//模拟单点修改 
	if(l<r)
	{
		ll k=(r-l+1)/2;
		if(pos>=l&&pos<=l+k-1)decrypt(l,l+k-1,pos);
		else decrypt(l+k,r,pos);
	}
	pos=l+r-pos;//模拟翻转 
}
int main()
{
	int t;
	sci(t);
	while(t--)
	{
		ll n,x;
		scll(n),scll(x);
		decrypt(1,n,x);
		printf("%lld\n",x);
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Code92007/article/details/82710068