Pagini recente » Cod sursa (job #1422349) | Cod sursa (job #411077) | Cod sursa (job #665298) | Cod sursa (job #3237537) | Cod sursa (job #2932110)
#include <iostream>
#include <fstream>
#define MAX 100002
using namespace std;
int n,k,v[MAX],dp[MAX],t[MAX],sol[MAX];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int cb(int val){
/// 0 0 0 0 1 1 1 1
/// ^
/// f() >= val
int st = 1, dr = k, ans = 0;
while(st <= dr){
int mid = (st+dr)/2;
if(v[dp[mid]] >= val){
ans = mid;
dr = mid-1;
}else{
st = mid+1;
}
}
return ( (ans == 0)?(k+1):ans );
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++){
fin >> v[i];
}
k = 1;
dp[k] = 1;
for(int i = 1; i <= n; i++){
int eval = cb(v[i]);
dp[eval] = i;
k = max(k, eval);
t[i] = dp[eval-1];
}
int pos = dp[k];
for(int i = k; i >= 1; i--){
sol[i] = v[pos];
pos = t[pos];
}
for(int i = 1; i <= k; i++){
fout << sol[i] << " ";
}
return 0;
}