C. Valhalla Siege
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Ivar the Boneless is a great leader. He is trying to capture Kattegat from Lagertha. The war has begun and wave after wave Ivar's warriors are falling in battle.

Ivar has (i−1)-th warrior. The first warrior leads the attack.

Each attacker can take up to i-th warrior's strength.

Lagertha orders her warriors to shoot t.

The battle will last for q minutes, after each minute you should tell Ivar what is the number of his standing warriors.

Input

The first line contains two integers 1≤n,q≤200000) — the number of warriors and the number of minutes in the battle.

The second line contains 1≤ai≤109) that represent the warriors' strengths.

The third line contains ki arrows will attack the warriors.

Output

Output i-th minute.

Examples
input
Copy
5 5
1 2 1 2 1
3 10 1 1 1
output
Copy
3
5
4
4
3
input
Copy
4 4
1 2 3 4
9 1 10 6
output
Copy
1
4
4
1
Note

In the first example:

  • after the 1-st minute, the 1-st and 2-nd warriors die.
  • after the 2-nd minute all warriors die (and all arrows left over are wasted), then they will be revived thus answer is 5 — all warriors are alive.
  • after the 3-rd minute, the 1-st warrior dies.
  • after the 4-th minute, the 2-nd warrior takes a hit and his strength decreases by 1.
  • after the 5-th minute, the 2-nd warrior dies

 

题意:你有n个士兵,每个士兵的生命值为

ki,如果在某一轮中士兵全部死光了,那么在这一轮结束的时候就会全部复活,且这一轮攻击剩下的伤害就会被忽略,问你每轮攻击结束后你会有多少个士兵。

题解:n个士兵的生命值记一下前缀和,每轮攻击的时候用upper_bound找一下前缀和里第一个大于

个士兵。
(这里前缀和处理的思想很实用,为了用二分优化时间,我们用前缀和的形式把多次造成的伤害记录为一次,这样使用二分的时候就简单很多了。)

 

题目:

Ivar the Boneless is a great leader. He is trying to capture Kattegat from Lagertha. The war has begun and wave after wave Ivar’s warriors are falling in battle.

Ivar has (i−1)-th warrior. The first warrior leads the attack.

Each attacker can take up to i-th warrior’s strength.

Lagertha orders her warriors to shoot t.

The battle will last for q minutes, after each minute you should tell Ivar what is the number of his standing warriors.

Input

The first line contains two integers q(1≤n,q≤200 000) — the number of warriors and the number of minutes in the battle.

The second line contains a1,a2,…,an(1≤ai≤109) that represent the warriors’ strengths.

The third line contains ki arrows will attack the warriors.

Output

Output i-th minute.

Examples

input

5 5
1 2 1 2 1
3 10 1 1 1
  • 1
  • 2
  • 3

output

3
5
4
4
3
  • 1
  • 2
  • 3
  • 4
  • 5

input

4 4
1 2 3 4
9 1 10 6
  • 1
  • 2
  • 3

output

1
4
4
1
  • 1
  • 2
  • 3
  • 4

Note

In the first example:

after the 1-st minute, the 1-st and 2-nd warriors die. 
after the 2-nd minute all warriors die (and all arrows left over are wasted), then they will be revived thus answer is 5 — all warriors are alive. 
after the 3-rd minute, the 1-st warrior dies. 
after the 4-th minute, the 2-nd warrior takes a hit and his strength decreases by 1. 
after the 5-th minute, the 2-nd warrior dies.


题意:

  你有n个士兵,每个士兵的生命值为ki,如果在某一轮中士兵全部死光了,那么在这一轮结束的时候就会全部复活,且这一轮攻击剩下的伤害就会被忽略,问你每轮攻击结束后你会有多少个士兵。


思路:

  对n个士兵的生命值记一下前缀和,每轮攻击的时候用upper_bound找一下前缀和里第一个大于n - cur + 1个士兵。

(用前缀和的思想把多次的伤寒换算为一次,这样使用二分的时候就简单很多了)

ac代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std; typedef long long ll; const int maxn = int(2e5) + 7; ll a[maxn], k[maxn], sum[maxn], dmg; int main() { int n, q; scanf("%d%d", &n, &q); for (int i = 1; i <= n; i++) scanf("%lld", a + i), sum[i] = sum[i - 1] + a[i]; for (int i = 1; i <= q; i++) scanf("%lld", k + i); for (int turn = 1, cur; turn <= q; turn++)
{ dmg
+= k[turn]; if (dmg >= sum[n]) dmg = 0, printf("%d\n", n); else printf("%d\n", n - int(std::upper_bound(sum + 1, sum + 1 + n, dmg) - sum - 1)); } return 0; }

 

相关文章: