Pagini recente » Cod sursa (job #2665411) | Cod sursa (job #3209348) | Cod sursa (job #2913750) | Cod sursa (job #950733) | Cod sursa (job #1984616)
#include <iostream>
#include<stdio.h>
int v[100001], sol[100001], poz[100001], vc[100001], r[100001];
using namespace std;
int main() {
FILE *fin, *fout;
int n, i, pozz, j, m, nr, ct, max, x, elem, rr;
fin=fopen("scmax.in", "r");
fout=fopen("scmax.out", "w");
fscanf( fin, "%d", &n);
for(i=1;i<=n;i++) {
fscanf( fin, "%d", &v[i]);
}
sol[1]=v[1];
nr=1;
poz[1]=1;
for(x=1;x<=n;x++) {
if(v[x]>sol[nr]) {
nr++;
poz[x]=nr;
sol[nr]=v[x];
}
else {
i=1;
j=nr;
ct=1;
while(i<=j) {
m=(i+j)/2;
if(sol[m]>v[x]) {
j=m-1;
ct=m;
}
else {
i=m+1;
}
}
sol[ct]=v[x];
poz[x]=ct;
}
}
max=0;
for(i=1;i<=n;i++) {
if(poz[i]>max) {
max=poz[i];
}
}
fprintf( fout, "%d\n", max);
elem=max;
rr=max;
for(i=n;i>=1;i--) {
if(vc[poz[i]]==0 && poz[i]==elem) {
vc[poz[i]]++;
r[rr]=v[i];
rr--;
elem--;
}
}
for(i=1;i<=max;i++) {
fprintf( fout, "%d ", r[i]);
}
fclose( fin );
fclose( fout );
return 0;
}