Ntarsis' Set (Codeforces 1853C)
Tags: Math, binary search

Ntarsis has been given a set $$$S$$$, initially containing integers $$$1, 2, 3, \ldots, 10^{1000}$$$ in sorted order. Every day, he will remove the $$$a_1$$$-th, $$$a_2$$$-th, $$$\ldots$$$, $$$a_n$$$-th smallest numbers in $$$S$$$ simultaneously.What is the smallest element in $$$S$$$ after $$$k$$$ days?

Input: Each test contains multiple test cases. The first line contains the number of test cases $$$t$$$ ($$$1 \le t \le 10^5$$$). The description of the test cases follows.The first line of each test case consists of two integers $$$n$$$ and $$$k$$$ ($$$1 \leq n,k \leq 2 \cdot 10^5$$$) — the length of $$$a$$$ and the number of days.The following line of each test case consists of $$$n$$$ integers $$$a_1, a_2, \ldots, a_n$$$ ($$$1 \leq a_i \leq 10^9$$$) — the elements of array $$$a$$$.It is guaranteed that:   The sum of $$$n$$$ over all test cases won't exceed $$$2 \cdot 10^5$$$;  The sum of $$$k$$$ over all test cases won't exceed $$$2 \cdot 10^5$$$;  $$$a_1 < a_2 < \cdots < a_n$$$ for all test cases. 

Output: For each test case, print an integer that is the smallest element in $$$S$$$ after $$$k$$$ days.

Note: For the first test case, each day the $$$1$$$-st, $$$2$$$-nd, $$$4$$$-th, $$$5$$$-th, and $$$6$$$-th smallest elements need to be removed from $$$S$$$. So after the first day, $$$S$$$ will become $$$\require{cancel}$$$ $$$\{\cancel 1, \cancel 2, 3, \cancel 4, \cancel 5, \cancel 6, 7, 8, 9, \ldots\} = \{3, 7, 8, 9, \ldots\}$$$. The smallest element is $$$3$$$.For the second case, each day the $$$1$$$-st, $$$3$$$-rd, $$$5$$$-th, $$$6$$$-th and $$$7$$$-th smallest elements need to be removed from $$$S$$$. $$$S$$$ will be changed as follows: Day$$$S$$$ before$$$S$$$ after1$$$\{\cancel 1, 2, \cancel 3, 4, \cancel 5, \cancel 6, \cancel 7, 8, 9, 10, \ldots \}$$$$$$\to$$$$$$\{2, 4, 8, 9, 10, \ldots\}$$$2$$$\{\cancel 2, 4, \cancel 8, 9, \cancel{10}, \cancel{11}, \cancel{12}, 13, 14, 15, \ldots\}$$$$$$\to$$$$$$\{4, 9, 13, 14, 15, \ldots\}$$$3$$$\{\cancel 4, 9, \cancel{13}, 14, \cancel{15}, \cancel{16}, \cancel{17}, 18, 19, 20, \ldots\}$$$$$$\to$$$$$$\{9, 14, 18, 19, 20, \ldots\}$$$ The smallest element left after $$$k = 3$$$ days is $$$9$$$.

Sample Inputs:
7
5 1
1 2 4 5 6
5 3
1 3 5 6 7
4 1000
2 3 4 5
9 1434
1 4 7 9 12 15 17 18 20
10 4
1 3 5 7 9 11 13 15 17 19
10 6
1 4 7 10 13 16 19 22 25 28
10 150000
1 3 4 5 10 11 12 13 14 15

Sample Outputs:
3
9
1
12874
16
18
1499986

Solution (Python):
import sys
input = sys.stdin.readline

def solve():
    (n, k) = map(int, input().split())
    a = list(map(int, input().split()))
    for i in range(n):
        a[i] -= i
    if a[0] != 1:
        print(1)
        return
    a.append(2000000000.0)
    (ans, inc) = (1, 1)
    while inc < n:
        days = (a[inc] - ans + inc - 1) // inc
        if days >= k:
            ans += k * inc
            k = 0
            break
        ans += days * inc
        k -= days
        while a[inc] <= ans:
            inc += 1
    ans += k * n
    print(ans)
for _ in range(int(input())):
    solve()

Solution (Python):
from collections import *
from functools import *
import sys
from bisect import *
input = lambda : sys.stdin.readline().rstrip()
Z = int(input())
for _ in range(Z):
    (n, days) = map(int, input().split())
    (*arr,) = map(int, input().split())
    ans = 0
    if arr[0] != 1:
        print(1)
        continue
    step = 1
    j = 1
    for step in range(1, n):
        num = arr[step]
        while num > step + j and days:
            j = step + j
            days -= 1
    if days == 0:
        print(j)
    else:
        print(j + n * days)

Solution (Python):
from collections import defaultdict, deque, Counter
from math import sqrt, ceil, log2, factorial, gcd
from itertools import combinations, permutations
from functools import lru_cache
from heapq import heappop, heappush, heapreplace, heapify
from bisect import bisect_left, bisect_right
from fractions import Fraction
from sys import stdin, stdout, setrecursionlimit
inf = float('inf')
write = lambda x='', end='\n': stdout.write(str(x) + end)
writes = lambda x, step=' ': stdout.write(step.join(map(str, x)) + '\n')
read = lambda x=int: x(stdin.readline().strip())
reads = lambda x=int: map(x, stdin.readline().strip().split())
for _ in range(read()):
    (n, k) = reads()
    lis = [0] + list(reads())
    ans = pos = 1
    for _ in range(k):
        while pos <= n and lis[pos] - pos < ans:
            pos += 1
        ans += pos - 1
    write(ans)