Pagini recente » Cod sursa (job #2483634) | Cod sursa (job #3130957) | Cod sursa (job #896863) | Cod sursa (job #1466660) | Cod sursa (job #2150939)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 100000;
int small[NMAX+2], best[NMAX+2], from[NMAX+2];
int N, longest = 0;
int v[NMAX+2];
int get_best_poz(int val)
{
int st = 0, dr = longest, last = 0;
while( st <= dr ) {
int mid = (st + dr) / 2;
if( v[ small[mid] ] >= val )
dr = mid - 1;
else
st = mid + 1, last = mid;
}
return small[ last ];
}
int main()
{
in >> N;
for( int i = 1; i <= N; ++i ) {
in >> v[i];
if( i == 1 ) {
best[i] = 1;
small[i] = 1;
from[i] = 0;
continue;
}
int poz = get_best_poz(v[i]);
best[i] = best[poz] + 1;
longest = max(longest, best[i]);
from[i] = poz;
small[ best[i] ] = i;
/// cout << from[i] << ' ';
}
int poz = 1;
for( int i = 1; i <= N; ++i ) {
if( best[i] > best[poz] )
poz = i;
}
out << best[poz] << '\n';
vector<int> ans;
while( poz ) {
ans.push_back(v[poz]);
poz = from[poz];
}
reverse(ans.begin(), ans.end());
for(auto& i : ans)
out << i << ' ';
return 0;
}