// C = A + B, A >= 0, B >= 0
vector<int>add(vector<int>&A, vector<int>&B){
if(A.size()< B.size())returnadd(B, A);
vector<int> C;int t =0;for(int i =0; i < A.size(); i ++){
t += A[i];if(i < B.size()) t += B[i];
C.push_back(t %10);
t /=10;}if(t) C.push_back(t);return C;}
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int>sub(vector<int>&A, vector<int>&B){
vector<int> C;for(int i =0, t =0; i < A.size(); i ++){
t = A[i]- t;if(i < B.size()) t -= B[i];
C.push_back((t +10)%10);if(t <0) t =1;else t =0;}while(C.size()>1&& C.back()==0) C.pop_back();return C;}
// C = A * b, A >= 0, b >= 0
vector<int>mul(vector<int>&A,int b){
vector<int> C;int t =0;for(int i =0; i < A.size()|| t; i ++){
if(i < A.size()) t += A[i]* b;
C.push_back(t %10);
t /=10;}while(C.size()>1&& C.back()==0) C.pop_back();return C;}
// A / b = C ... r, A >= 0, b > 0
vector<int>div(vector<int>&A,int b,int&r){
vector<int> C;
r =0;for(int i = A.size()-1; i >=0; i --){
r = r *10+ A[i];
C.push_back(r / b);
r %= b;}reverse(C.begin(), C.end());while(C.size()>1&& C.back()==0) C.pop_back();return C;}
vector<int> alls;// 存储所有待离散化的值sort(alls.begin(), alls.end());// 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());// 去掉重复元素// 二分求出x对应的离散化的值intfind(int x)// 找到第一个大于等于x的位置{
int l =0, r = alls.size()-1;while(l < r){
int mid = l + r >>1;if(alls[mid]>= x) r = mid;else l = mid +1;}return r +1;// 映射到1, 2, ...n}