Pagini recente » Cod sursa (job #1254104) | Cod sursa (job #871421) | Cod sursa (job #259869) | Istoria paginii runda/pre-oji2014/clasament | Cod sursa (job #1027712)
#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, NMax;
int sol[NMAX];
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;
}
}
for(int i = 1; i <= n; ++ i){
Max = max(Max, best[i]);
///printf("%d ", best[i]);
}
for(int i = 1; i <= n; ++ i)
if(Max == best[i])
sol[++ sol[0]] = a[i];
NMax = Max;
-- Max;
for(int i = n; i >= 1; -- i)
if(best[i] == Max && a[i] < sol[sol[0]]){
sol[++ sol[0]] = 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[0]);
reverse(sol + 1, sol + sol[0] + 1);
for(int i = 1; i <= sol[0]; ++ i)
printf("%d ", sol[i]);
printf("\n");
return 0;
}