Pagini recente » Cod sursa (job #1672261) | Cod sursa (job #1510898) | Cod sursa (job #1073224) | Cod sursa (job #2964836) | Cod sursa (job #2814834)
#include <bits/stdc++.h>
using namespace std;
class parsare{
private:
FILE *fin;
char *buff;
int sp;
char read_ch(){
++sp;
if(sp==4096){
sp=0;
fread(buff,1,4096,fin);
}
return buff[sp];
}
public:
parsare(const char *name){
fin=fopen(name,"r");
buff=new char[4096]();
sp=4095;
}
parsare& operator >>(int &n){
char c;
while(!isdigit(c=read_ch()));
n=c-'0';
while(isdigit(c=read_ch()))
n=n*10+c-'0';
return *this;
}
};
const int nmax=1e5;
int n,A[nmax+1],best[nmax+1],L[nmax+1],p[nmax+1],nr=1;
inline int caut(int x){
int st=0,dr=nr,mid;
while(st<=dr){
mid=(st+dr)/2;
if(A[L[mid]]<x && A[L[mid+1]]>=x)
return mid;
else if(A[L[mid]]<x)
st=mid+1;
else dr=mid-1;
}
return nr;
}
FILE *g=fopen("scmax.out","w");
void afis(int i){
if(p[i]>0)afis(p[i]);
fprintf(g,"%d ",A[i]);
}
static void solve(){
best[1]=L[1]=1,L[0]=0;
int poz;
for(int i=2;i<=n;++i){
poz=caut(A[i]);
p[i]=L[poz];
best[i]=poz+1;
L[poz+1]=i;
if(nr<poz+1)nr=poz+1;
}
poz=0;
int maxim=-1;
for(int i=1;i<=n;++i)
if(maxim<best[i]){
maxim=best[i];
poz=i;
}
fprintf(g,"%d\n",maxim);
afis(poz);
}
int main()
{
parsare fin("scmax.in");
fin>>n;
for(int i=1;i<=n;++i)
fin>>A[i];
solve();
}