Pagini recente » Cod sursa (job #3219981) | Cod sursa (job #2394158) | Cod sursa (job #1661464) | Cod sursa (job #1936231) | Cod sursa (job #1454176)
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <time.h>
#include <bitset>
#include <string>
#include <vector>
#include <math.h>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <map>
#include <limits.h>
#include <algorithm>
#include <deque>
#define nmax 100010
using namespace std;
int n,i,j,sol[nmax],b[nmax],t[nmax],v;
inline int max(int a,int b) { if (a>b) return a; else return b; }
int cauta(int st,int dr,int x)
{
int m;
while (st<=dr){
m=(st+dr)/2;
if (sol[m]<x) st=m+1; else dr=m-1;
}
return st;
}
int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&t[i]);
v=1; b[1]=1; sol[1]=t[1];
for (i=2;i<=n;i++){
j=cauta(1,v,t[i]); b[i]=j;
sol[j]=t[i]; v=max(v,j);
}
j=v;
for (i=n;i>=1;i--)
if (b[i]==v) { sol[v]=t[i]; v--; }
printf("%d\n",j);
for (i=1;i<=j;i++) printf("%d ",sol[i]);
return 0;
}