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
3
5
4
4
3
input
4 4
1 2 3 4
9 1 10 6
output
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.

 这题其实就是一个前缀和二分查找。

 

 

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <vector>
 4 #include <queue>
 5 #include <cstring>
 6 #include <string>
 7 using namespace std;
 8 const int maxn = 2e5 + 10;
 9 long long a[maxn], b[maxn], sum[maxn], sum1[maxn];
10 int main() {
11     long long n, q;
12     while(scanf("%lld%lld", &n, &q) != EOF) {
13         sum[0] = 0;
14         for (long long i = 1 ; i <= n ; i++) {
15             scanf("%lld", &a[i]);
16             sum[i] = sum[i - 1] + a[i];
17         }
18         for (long long i = 1 ; i <= q ; i++) {
19             scanf("%lld", &b[i]);
20         }
21         long long temp = 0, cnt, ret = 0;
22         for (long long i = 1 ; i <= q ; i++) {
23             cnt = upper_bound(sum + 1, sum + n + 1, sum[temp] + b[i] + ret) - sum - 1;
24             ret = a[cnt + 1] - (sum[cnt + 1] - sum[temp] - b[i] - ret);
25             if (ret == a[cnt + 1]) ret = 0;
26             temp = cnt;
27             if (temp == n  )  {
28                 temp = 0;
29                 ret = 0;
30             }
31             printf("%lld\n", n - temp);
32         }
33     }
34     return 0;
35 }
View Code

 

相关文章:

  • 2022-01-26
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-13
  • 2021-07-03
猜你喜欢
  • 2022-12-23
  • 2021-05-25
  • 2022-12-23
  • 2021-07-04
  • 2021-04-30
相关资源
相似解决方案