Pagini recente » Cod sursa (job #288868) | Cod sursa (job #2686158) | Cod sursa (job #705742) | Cod sursa (job #1139673) | Cod sursa (job #2706020)
#include <iostream>
#include <fstream>
#define MAX 100002
using namespace std;
int n,k,v[MAX],dp[MAX],tata[MAX],rez[MAX];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int cautareBinara(int x){
/// cel mai mic element >= x
int st = 1,dr = k;
int sol = 0;
while(st <= dr){
int mid = (st+dr)/2;
if(v[dp[mid]] >= x){
dr = mid-1; sol = mid;
}
else{
st = mid+1;
}
}
if(sol == 0){
return k+1;
}
return sol;
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++){
fin >> v[i];
}
k = 1;
dp[k] = 1;
for(int i = 2; i <= n; i++){
/// determin dp[i];
int r = cautareBinara(v[i]);
dp[r] = i;
if(r > k){
k = r;
}
tata[i] = dp[r-1];
}
fout << k << "\n";
int poz = dp[k];
for(int i = k; i >= 1; i--){
rez[i] = v[poz];
poz = tata[poz];
}
for(int i = 1; i <= k; i++){
fout << rez[i] << " ";
}
return 0;
}