Pagini recente » Cod sursa (job #674635) | Cod sursa (job #494776) | Cod sursa (job #2780190) | Cod sursa (job #1354232) | Cod sursa (job #1423709)
#include<fstream>
#include<algorithm>
using namespace std;
int n, i, p, u, mid, nr, maxim;
int v[100002], t[100002], f[100002], a[100002], L[100002];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void update(int p){
for(int i = p; i <= nr; i += (i & -i)){
if(L[p] > L[a[i]]){
a[i] = p;
}
}
}
int query(int p){
int maxim = 0;
int nr = 0;
for(; p; p -= (p & -p)){
if(maxim < L[a[p]]){
maxim = L[a[p]];
nr = a[p];
}
}
return nr;
}
void drum(int p){
if(p != 0){
drum(t[p]);
fout<< f[p] <<" ";
}
}
int main(){
fin>> n;
for(i = 1; i <= n; i++){
fin>> v[i];
f[i] = v[i];
}
sort(f + 1, f + n + 1);
nr = 1;
for(i = 2; i <= n; i++){
if(f[i] != f[nr]){
f[++nr] = f[i];
}
}
for(i = 1; i <= n; i++){
p = 1;
u = nr;
while(p <= u){
mid = (p + u) / 2;
if(f[mid] == v[i]){
break;
}
else{
if(f[mid] < v[i]){
p = mid + 1;
}
else{
u = mid - 1;
}
}
}
v[i] = mid;
}
L[v[1]] = 1;
update(v[1]);
for(i = 2; i <= n; i++){
maxim = query(v[i]);
if(maxim == 0 && L[v[i]] == 0){
L[v[i]] = 1;
update(v[i]);
}
else{
if(L[maxim] > L[v[i]]){
L[v[i]] = L[maxim] + 1;
t[v[i]] = maxim;
update(v[i]);
}
}
}
for(i = 1; i <= nr; i++){
if(L[i] > maxim){
maxim = L[i];
p = i;
}
}
fout<< maxim <<"\n";
drum(p);
return 0;
}