using System;
using System.Collections.Generic;
class GFG {
// build segment tree storing max values
static void buildTree(int idx, int l, int r, int[] seg, int[] a) {
if (l == r) {
seg[idx] = a[l];
return;
}
int mid = (l + r) / 2;
buildTree(2 * idx, l, mid, seg, a);
buildTree(2 * idx + 1, mid + 1, r, seg, a);
seg[idx] = Math.Max(seg[2 * idx], seg[2 * idx + 1]);
}
// find first index such that A[i] >= x
static int findFirst(int idx, int l, int r, int[] seg, int x) {
if (seg[idx] < x)
return -1;
if (l == r)
return l;
int mid = (l + r) / 2;
if (seg[2 * idx] >= x)
return findFirst(2 * idx, l, mid, seg, x);
return findFirst(2 * idx + 1, mid + 1, r, seg, x);
}
// update A[pos] = val
static void updateTree(int idx, int l, int r, int[] seg, int pos, int val) {
if (l == r) {
seg[idx] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
updateTree(2 * idx, l, mid, seg, pos, val);
else
updateTree(2 * idx + 1, mid + 1, r, seg, pos, val);
seg[idx] = Math.Max(seg[2 * idx], seg[2 * idx + 1]);
}
// process all queries (returns List<int>)
static List<int> processQueries(int[] a, int[] queries) {
int n = a.Length;
int[] arr = new int[n];
Array.Copy(a, arr, n);
int[] seg = new int[4 * n];
buildTree(1, 0, n - 1, seg, arr);
List<int> result = new List<int>();
foreach (int x in queries) {
if (seg[1] < x) {
result.Add(0);
continue;
}
int pos = findFirst(1, 0, n - 1, seg, x);
arr[pos] -= x;
updateTree(1, 0, n - 1, seg, pos, arr[pos]);
result.Add(pos + 1);
}
return result;
}
static void Main() {
int[] a = {3, 2, 4, 1, 5, 5, 2, 6};
int[] queries = {4, 4, 7, 1, 1};
var res = processQueries(a, queries);
Console.WriteLine(string.Join(" ", res));
}
}