Pagini recente » Cod sursa (job #877273) | Cod sursa (job #2515978) | Autentificare | Cod sursa (job #805458) | Cod sursa (job #2571793)
#include <fstream>
using namespace std;
int n, i, j, k, maxim=-1, p;
int v[100001], dp[100001], tata[100001], poz[100001], sol[100001];
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int cautbin (int k, int x)
{
int st=1, dr=k;
while (st<=dr) {
int mid = (st+dr)/2;
if (v[poz[mid]]>=x)
dr=mid-1;
else
st=mid+1;
}
return st;
}
int main () {
fin>>n;
for (i=1;i<=n;i++) {
fin>>v[i];
}
k=1; poz[k]=1; tata[1]=0;
for (i=2;i<=n;i++) {
p=cautbin(k, v[i]);
poz[p]=i;
k=max(k, p);
dp[i]=k;
tata[i]=poz[p-1];
}
for (i=1;i<=n;i++) {
if (dp[i]>maxim) {
maxim=dp[i];
p=i;
}
}
fout<<maxim<<"\n";
k=maxim;
while (k>0) {
sol[k]=v[p];
k--;
p=tata[p];
}
for (i=1;i<=maxim;i++)
fout<<sol[i]<<" ";
return 0;
}