Pagini recente » Istoria paginii runda/cei_mai_mari_olimpicari_runda_3 | Cod sursa (job #1872389) | Cod sursa (job #1830554) | Cod sursa (job #1882569) | Cod sursa (job #2013951)
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100001
using namespace std;
int n,a[MAX],nmax[MAX],smax,mmax[MAX],s,d,m;
vector<int> r;
int main()
{
ifstream f ("scmax.in");
ofstream g ("scmax.out");
f>>n;
for(int i=1;i<MAX;i++)nmax[i]=2e9;
for(int i=1;i<=n;i++){
f>>a[i]; mmax[i]=1;
s=0;d=smax;
while(s<d){
m=(s+d+1)/2;
if(nmax[m]>a[i]-1)d=m-1;
else s=m;
}
if(a[i]<nmax[0])nmax[0]=a[i];
else{
nmax[s+1]=a[i]; mmax[i]=s+1;
if(s==smax) smax++;
}
if(i==1)smax=1;
}
g<<smax<<'\n';
for(int i=n,aj=smax;i>=1&&aj>=1;i--)
if(mmax[i]==aj)r.push_back(a[i]),aj--;
for(int i=r.size()-1;i>=0;i--)g<<r[i]<<" ";
f.close ();
g.close ();
return 0;
}