Pagini recente » Cod sursa (job #2661860) | Cod sursa (job #2248199) | Cod sursa (job #2820287) | Cod sursa (job #1797283) | Cod sursa (job #399798)
Cod sursa(job #399798)
#include <cstdio>
//<parsing>
#define MAXB 8192
char buf[MAXB];
unsigned ptr=0;
FILE* fin=fopen("scmax.in","rb");
int getInt(){
while(buf[ptr]<'0'||'9'<buf[ptr]){
if(++ptr>=MAXB){
fread(buf,1,MAXB,fin);
ptr=0;
}
}
int nr=0;
while('0'<=buf[ptr]&&buf[ptr]<='9'){
nr=nr*10+buf[ptr]-'0';
if(++ptr>=MAXB){
fread(buf,1,MAXB,fin);
ptr=0;
}
}
return nr;
}
//</parsing>
#define MAX 100010
int vec[MAX],vP[MAX],v[MAX],l[MAX],n,nr=1;
int search(int x){
int beg=0,end=nr,mdl;
while (beg<=end){
mdl=(beg+end)/2;
if(vec[l[mdl]]<x&&vec[l[mdl+1]]>=x){
return mdl;
}else if(vec[l[mdl+1]]<x){
beg=mdl+1;
}else{
end =mdl-1;
}
}
return nr;
}
void write(int i){
if(vP[i]>0){
write(vP[i]);
}
printf("%d ",vec[i]);
}
int main(){
fread(buf,1,MAXB,fin);
freopen("scmax.out","wt",stdout);
int max=0,k,poz;
n=getInt();
for(int i=1;i<=n;i++){
vec[i]=getInt();
}
v[1]=l[1]=1,l[0]=0;
for(int i=2;i<=n;i++){
int poz=search(vec[i]);
vP[i]=l[poz];
v[i]=poz+1;
l[poz+1]=i;
if(nr<poz+1){
nr=poz+1;
}
}
max=poz=0;
for(int i=1;i<=n;i++){
if(max<v[i]){
max=v[i],poz=i;
}
}
printf("%d\n",max);
write(poz);
fclose(fin);
}