Pagini recente » Cod sursa (job #1874978) | Cod sursa (job #3213270) | Cod sursa (job #2931517) | Cod sursa (job #2573459) | Cod sursa (job #1264922)
#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]);
for (int i=1;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;
}