Pagini recente » Cod sursa (job #1342011) | Cod sursa (job #966983) | Cod sursa (job #2579258) | Cod sursa (job #1382835) | Cod sursa (job #1264917)
#include <cstdio>
using namespace std;
#define nmax 100002
FILE *f=fopen ("scmax.in","r");
FILE *g=fopen ("scmax.out","w");
int v[nmax],vmin[nmax],D[nmax],prev[nmax],ap[nmax];
int bsearch (int st, int dr, int val){
int mid;
while (st<=dr){
mid=(st+dr)>>1;
if (vmin[mid]<val) st=mid+1;
else dr=mid-1;
}
return dr;
}
void remake (int poz){
if (poz==0) return;
remake (prev[poz]);
fprintf (g,"%d ",v[poz]);
}
int main(){
int n,max=-1,poz,lg=0;
fscanf (f,"%d",&n);
for (int i=1;i<=n;++i) fscanf (f,"%d",&v[i]);
D[1]=1; vmin[1]=v[1]; lg=1;
for (int i=2;i<=n;++i){
int k=bsearch (1,lg,v[i]);
D[i]=D[ap[k]]+1;
prev[i]=ap[k];
if (D[i]>max){
max=D[i];
poz=i;
}
if (vmin[D[i]]>v[i] || vmin[D[i]]==0){
if (vmin[D[i]]==0) lg++;
vmin[D[i]]=v[i];
ap[D[i]]=i;
}
}
fprintf (g,"%d\n",max);
remake (poz);
return 0;
}