vector lis(vector& a) { int n = ssize(a), len = 0; vector dp(n, INF), dp_id(n), prev(n); for (int i = 0; i < n; i++) { int pos = ranges::lower_bound(dp, a[i]) - begin(dp); dp[pos] = a[i]; dp_id[pos] = i; prev[i] = pos ? dp_id[pos - 1] : -1; len = max(len, pos + 1); } // reconstruction vector res(len); for (int x = dp_id[len-1]; len--; x = prev[x]) { res[len] = x; } return res; // indices of one LIS }