Pagini recente » Cod sursa (job #693313) | Cod sursa (job #1608372) | Cod sursa (job #1520647) | Cod sursa (job #353383) | Cod sursa (job #1027838)
#include<stdio.h>
#include<vector>
#include<algorithm>
#define NMAX 100007
#define x first
#define y second
using namespace std;
int a[NMAX], n, best[NMAX], Max;
int sol[NMAX];
inline int search(int val, vector< pair<int, int> > v){
int st = 0, dr = v.size() - 1, med;
while(st <= dr){
med = (st + dr) >> 1;
if(v[med].x >= val)
dr = med - 1;
else
st = med + 1;
}
return st;
}
int main(){
freopen("scmax.in" , "r" , stdin);
freopen("scmax.out" , "w" , stdout);
scanf("%d", &n);
for(int i = 1; i <= n; ++ i)
scanf("%d", &a[i]);
vector< pair<int,int> > v;
v.push_back(make_pair(a[1], 1));
best[1] = 1;
for(int i = 2; i <= n; ++ i){
int Number = search(a[i], v);
if(Number == v.size()){
v.push_back(make_pair(a[i], i));
best[i] = best[v[v.size() - 2].y] + 1;
}
else{
v[Number].x = a[i];
v[Number].y = i;
best[i] = best[Number] + 1;
}
}
for(int i = 1; i <= n; ++ i){
Max = max(Max, best[i]);
}
for(int i = 1; i <= n; ++ i)
if(Max == best[i]){
sol[++ sol[0]] = a[i];
break;
}
-- Max;
for(int i = n; i >= 1 && Max >= 0; -- i)
if(best[i] == Max){
sol[++ sol[0]] = a[i];
-- Max;
}
printf("%d\n", sol[0]);
for(int i = sol[0]; i >= 1; -- i)
printf("%d ", sol[i]);
printf("\n");
return 0;
}