CF1249D2 Too Many Segments (hard version)
Description
The only difference between easy and hard versions is constraints.
You are given $ n $ segments on the coordinate axis $ OX $ . Segments can intersect, lie inside each other and even coincide. The $ i $ -th segment is $ [l_i; r_i] $ ( $ l_i \le r_i $ ) and it covers all integer points $ j $ such that $ l_i \le j \le r_i $ .
The integer point is called bad if it is covered by strictly more than $ k $ segments.
Your task is to remove the minimum number of segments so that there are no bad points at all.
Input Format
The first line of the input contains two integers $ n $ and $ k $ ( $ 1 \le k \le n \le 2 \cdot 10^5 $ ) — the number of segments and the maximum number of segments by which each integer point can be covered.
The next $ n $ lines contain segments. The $ i $ -th line contains two integers $ l_i $ and $ r_i $ ( $ 1 \le l_i \le r_i \le 2 \cdot 10^5 $ ) — the endpoints of the $ i $ -th segment.
Output Format
In the first line print one integer $ m $ ( $ 0 \le m \le n $ ) — the minimum number of segments you need to remove so that there are no bad points.
In the second line print $ m $ distinct integers $ p_1, p_2, \dots, p_m $ ( $ 1 \le p_i \le n $ ) — indices of segments you remove in any order. If there are multiple answers, you can print any of them.