Pagini recente » Cod sursa (job #253877) | Cod sursa (job #94308) | Cod sursa (job #456403) | Cod sursa (job #547571) | Cod sursa (job #2792726)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
#define cin fin
#define cout fout
#define N 100005
int n, len, i,k,a[N],b[N],urm[N],ind,x;
int Find(int left, int right, int val)
{
if(left>right)return -1;
int mij=(left+right)/2;
if(a[b[mij]]<val)return Find(mij+1, right, val);
int answ=Find(left, mij-1, val);
if(answ!=-1)return answ;
return mij;
}
void solve()
{
for(int i=1; i<=n; i++)urm[i]=-1;
b[0]=-1;
for(int i=1; i<=n; i++)
{
k=Find(1, len, a[i]);
if(k==-1)
{
b[++len]=i;
urm[i]=b[len-1];
}
else
{
b[k]=i;
urm[i]=b[k-1];
}
}
cout<<len<<'\n';
ind=b[len];
len=0;
while(ind!=-1)
{
b[++len]=a[ind];
ind=urm[ind];
}
for(int i=len;i;i--)cout<<b[i]<<" ";
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
solve();
return 0;
}