Pagini recente » Cod sursa (job #2267699) | Cod sursa (job #1003780) | Cod sursa (job #1344551) | Cod sursa (job #1125166) | Cod sursa (job #1027851)
#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], Size;
pair<int, int> v[NMAX];
inline int search(int val, pair<int, int> v[]){
int st = 1, dr = Size, 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]);
v[++ Size].x = a[1];
v[Size].y = 1;
best[1] = 1;
for(int i = 2; i <= n; ++ i){
int Number = search(a[i], v);
if(Number == Size + 1){
best[i] = Size + 1;
v[++ Size].x = a[i];
v[Size].y = i;
}
else{
v[Number].x = a[i];
v[Number].y = i;
best[i] = best[Number - 1] + 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;
}