这是二分优化的 LIS(严格上升)子序列
#define int long longint len[N];
int mylower(int x, int l, int r){while(l < r){int mid = (l + r + 1) >> 1;if(x > len[mid]){l = mid;}else{r = mid - 1;}}return l;
}
int LIS(vector<int> v){len[0] = -inf;for(int i = 1; i < N; i++){len[i] = inf;}int vs = v.size();for(int i = 0; i < vs; i++){int pos = mylower(v[i], 0, i);len[pos + 1] = min(len[pos + 1], v[i]); }for(int i = 1; i <= vs + 1; i++){if(len[i] == inf){return i - 1;}}
}