Pagini recente » Cod sursa (job #1757243) | Cod sursa (job #1506682) | Cod sursa (job #2405317) | Cod sursa (job #1316582) | Cod sursa (job #1913210)
#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int NMax = 100005;
const int INF = 2000000002;
int n,nr,last;
int a[NMax],L[NMax],dp[NMax];
vector<int> ans;
int cautbin(int lo,int hi,int x){
int mid;
while(lo <= hi){
int mid = (lo + hi) / 2;
if(L[mid] >= x && L[mid - 1] < x){
return mid;
}else
if(L[mid] >= x){
hi = mid - 1;
}else
if(L[mid - 1] < x){
lo = mid + 1;
}
}
return 0;
}
int main()
{
f >> n;
for(int i = 1; i <= n; ++i){
f >> a[i];
}
nr = 0;
for(int i = 1; i <= n; ++i){
if(L[nr] < a[i]){
nr++;
L[nr] = a[i];
dp[i] = nr;
}else{
int e = cautbin(1,nr,a[i]);
if(e != 0){
L[e] = a[i];
dp[i] = e;
}
}
}
g << nr << '\n';
last = INF;
for(int i = n; i >= 1; --i){
if(dp[i] == nr && a[i] < last){
ans.push_back(a[i]);
nr--;
last = a[i];
}
}
for(int i = ans.size() - 1; i >= 0; --i){
g << ans[i] << ' ';
}
return 0;
}