private void grow(int extra, int[] values, int[] max, boolean fill) {
		int count = 1 + (values.length - 1) / 2;
		int[] tv = new int[count];
		int[] tm = new int[count];
		for (int i = 0; i < count; i++) {
			tv[i] = values[i * 2];
			tm[i] = max[i * 2];
		}
		extra = distribute(extra, tv, tm);
		for (int i = 0; i < count; i++) {
			values[i * 2] = tv[i];
		}

		if (extra > 0 && fill) {
			// None are accepting more space, so force them
			count = 1 + (values.length - 1) / 2;
			while (extra > 0) {
				int amt = extra / count;
				if (amt < 1) {
					amt = 1;
				}
				for (int i = 0; i <= values.length && extra > 0; i += 2) {
					values[i] += amt;
					max[i] += amt;
					extra -= amt;
				}
			}
		}
	}