Pagini recente » Cod sursa (job #846770) | Cod sursa (job #1458130) | Cod sursa (job #1413673) | Cod sursa (job #1458184) | Cod sursa (job #1027702)
#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];
vector<int> sol;
inline int search(int val, vector< pair<int, int> > v){
int st = 0, dr = v.size(), med, last = -1;
while(st <= dr){
med = (st + dr) >> 1;
if(v[med].x >= val){
dr = med - 1;
last = med;
}
else
st = med + 1;
}
return last;
}
void solve(int a[NMAX]){
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 == -1){
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;
}
}
int Max = 0;
sol.push_back(0);
for(int i = 1; i <= n; ++ i){
Max = max(Max, best[i]);
if(Max == best[i])
sol[0] = a[i];
///printf("%d ", best[i]);
}
-- Max;
for(int i = n; i >= 1; -- i)
if(best[i] == Max && a[i] < sol[sol.size() - 1]){
sol.push_back(a[i]);
-- Max;
}
}
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]);
solve(a);
printf("%d\n", sol.size());
for(int i = sol.size() - 1; i >= 0; -- i)
printf("%d ", sol[i]);
return 0;
}