题目描述
castella 的形状是一个在水平方向上很长的长方体。它被切成了 N 段,其中从左往右的第 i 段的长度为整数Ai。
几分钟前,我们得知 JOI 星球的居民不喜欢偶数。为了解决此问题,你需要不断执行下列操作,直到不存在长度为偶数的段。
- 在长度为偶数的段中,你选择最靠右的一段。
- 你将选中的这一段切成两个长度相等的段。也就是说,假设选中的这一段的长度是 k,你将其切成长度为 22k 的两段。你不改变其他段的位置。
为了确认操作是否被正确地执行了,比太郎让你回答 Q 个询问。第 j 个询问如下:
- 当所有操作执行完毕后,从左往右的第 Xj 段的长度为多少?
给定 castella 的信息与询问,请写一个程序回答所有询问。
输入格式
第一行,一个正整数 N。
接下来 N 行,第 i 行一个正整数 Ai。
接下来一行,一个正整数 Q。
接下来Q 行,第 j 行一个正整数 Xj。
输出格式
输出 Q 行,第 j 行一个数,表示第 j 个询问的答案。
输入输出样例
输入 #1
4 14 9 8 12 6 2 3 5 7 11 13
输出 #1
7 9 1 1 1 3
输入 #2
13 1 4 1 4 2 1 3 5 6 2 3 7 3 8 2 10 11 13 15 17 18 20
输出 #2
1 1 1 1 5 3 1 3
输入 #3
16 536870912 402653184 536870912 536870912 134217728 536870912 671088640 536870912 536870912 536870912 939524096 805306368 536870912 956301312 536870912 536870912 5 2500000000 3355443201 4294967296 5111111111 6190792704
输出 #3
5 1 7 57 1
#include<bits/stdc++.h>
#define in long long
#define maxn 200005
#define getll(x) scanf("%lld", &x)
using namespace std;
in n, a[maxn], num[maxn], q, x, s[maxn];
int main()
{
getll(n);
for(in i = 1; i <= n; i++)
{
num[i] = 1;
getll(a[i]);
while(!(a[i] & 1))
{
a[i] >>= 1;
num[i] <<= 1;
}
s[i] = s[i - 1] + num[i];
}
getll(q);
while(q--)
{
getll(x);
in ans = a[(lower_bound(s + 1, s + 1 + n, x) - s)];
printf("%lld\n", ans);
}
return 0;
}