Pagini recente » Cod sursa (job #1504113) | Cod sursa (job #1741246) | Cod sursa (job #2129232) | Cod sursa (job #1636098) | Cod sursa (job #1423744)
#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], b[100002], pmaxim;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void update(int p, int val, int poz){
for(p; p <= nr; p += (p & -p)){
if(val > a[p]){
a[p] = val;
b[p] = poz;
}
}
}
int query(int p){
int maxim = 0;
for(; p; p -= (p & -p)){
if(maxim < a[p]){
maxim = a[p];
pmaxim = b[p];
}
}
return maxim;
}
void drum(int p){
if(p != 0){
drum(t[p]);
fout<< f[v[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[1] = 1;
update(v[1], L[1], 1);
for(i = 2; i <= n; i++){
maxim = query(v[i]-1);
L[i] = 1 + maxim;
if (L[i] != 1)
t[i] = pmaxim;
update(v[i], L[i], i);
}
maxim = 0;
for(i = 1; i <= n; i++){
if(L[i] > maxim){
maxim = L[i];
p = i;
}
}
fout<< maxim <<"\n";
drum(p);
return 0;
}