Pagini recente » Cod sursa (job #1688427) | Cod sursa (job #1405418) | Cod sursa (job #1147681) | Cod sursa (job #1367681) | Cod sursa (job #3195878)
#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int nMax = 100005;
int n, a[nMax], lis[nMax], poz[nMax], k, ans[nMax];
void Read(){
f >> n;
for(int i = 1; i <= n; i++)
f >> a[i];
}
int BSearch(int x){
int st, dr, m, p;
st = 1;
dr = k;
while(st <= dr){
m = (st + dr) / 2;
if(lis[m] < x){
st = m + 1;
}
else{
p = m;
dr = m - 1;
}
}
return p;
}
void Solve(){
int x, p;
lis[1] = a[1];
poz[1] = k = 1;
for(int i = 2; i <= n; i++){
x = a[i];
if(x > lis[k]){
lis[++k] = x;
poz[i] = k;
}
else{
p = BSearch(x);
lis[p] = x;
poz[i] = p;
}
}
g << k << "\n";
for(int i = n; i && k; i--){
if(poz[i] == k){
ans[k--] = a[i];
}
}
while(ans[++k]){
g << ans[k] << " ";
}
}
int main()
{
Read();
Solve();
return 0;
}