Pagini recente » Cod sursa (job #903153) | Cod sursa (job #3324207) | Cod sursa (job #3322140) | Cod sursa (job #2527992) | Cod sursa (job #3319094)
#include <fstream>
#include <iostream>
#include <queue>
#include <bitset>
#include <stack>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[100005],poz[100005];
int dp[100005];
int k=1;
int cb(int val) {
int st=1,dr=k;
int sol;
while (st<=dr) {
int mij=(st+dr)/2;
if (dp[mij]>=val)
sol=mij,dr=mij-1;
else
st=mij+1;
}
return sol;
}
int main() {
int n;
fin>>n;
for (int i=1; i<=n; i++)
fin>>a[i];
dp[1]=a[1];
poz[1]=1;
for (int i=2; i<=n; i++) {
if (dp[k]<a[i])
dp[++k]=a[i],poz[i]=k;
else {
int pos=cb(a[i]);
dp[pos]=a[i];
poz[i]=pos;
}
}
fout<<k<<"\n";
stack<int> st;
for (int i=1; i<=n; i++)
if (poz[i]==k)
{st.push(i);break;}
for (int i=st.top()-1; i>=1; i--)
if (a[i]<a[st.top()] and poz[i]==poz[st.top()]-1)
st.push(i);
while (!st.empty()) {
fout<<a[st.top()]<<" ";
st.pop();
}
return 0;
}