Pagini recente » Cod sursa (job #2316599) | Cod sursa (job #2205403)
/// dp[i]=max(dp[j], v[j]<v[i])+1
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int const DIM = 1e5+100;
int dp[DIM], last[DIM];
int v[DIM];
int binara(int left, int right, int elem){
if (left==right) return left;
int mid=(left+right+1)/2;
if (elem<=last[mid]) return binara(left, mid-1, elem);
else return binara(mid, right, elem);
}
int main(){
int n, i, nr;
in >> n;
int lmax=0;
for (i=1; i<=n; i++){
in >> nr;
v[i]=nr;
if (nr>last[lmax]){
last[++lmax]=nr;
dp[i]=lmax;
continue;
}
int poz=binara(0, lmax, nr);
dp[i]=poz+1;
if (last[poz+1]>nr) last[poz+1]=nr;
}
out << lmax << '\n';
vector<int> ans;
for (i=n; i>=1; i--)
if (dp[i]==lmax){
ans.push_back(v[i]);
lmax--;
}
reverse(ans.begin(), ans.end());
for (auto x: ans)
out << x << ' ';
}