Pagini recente » Cod sursa (job #122544) | Cod sursa (job #2484628) | Autentificare | Cod sursa (job #1640237) | Cod sursa (job #998437)
Cod sursa(job #998437)
#include <fstream>
#include <algorithm>
using namespace std;
const int MAX_N = 100002;
int N, Max, K;
int v[MAX_N], best[MAX_N], pre[MAX_N], A[MAX_N], a[MAX_N], D[MAX_N], sol[MAX_N];
inline void Update(int pos, int ind) {
for( ; pos <= N; pos += pos^(pos&(pos-1))) {
if(best[ind] > best[A[pos]])
A[pos] = ind;
}
}
inline int Query(int pos) {
int ind = 0;
for( ; pos > 0; pos -= pos^(pos&(pos-1)))
if(best[A[pos]] > best[ind])
ind = A[pos];
return ind;
}
inline int bs(int x) {
int l = 1, r = K, m = 0;
while(l <= r) {
m = (l+r)/2;
if(a[m] < x)
l = m+1;
else if(a[m] > x)
r = m-1;
else return m;
}
return 0;
}
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
f >> N;
for(int i = 1; i <= N; ++i) {
f >> v[i];
a[i] = v[i];
}
sort(a+1, a+N+1);
K = 1;
for(int i = 2; i <= N; ++i)
if(a[i] != a[K])
a[++K] = a[i];
int temp = 0;
for(int i = 1; i <= N; ++i) {
int x = bs(v[i]);
int p = Query(x-1);
best[i] = best[p] + 1, pre[i] = p;
if(best[i] > Max)
Max = best[i], temp = i;
if(best[i] > D[x]) {
D[x] = best[i];
Update(x, i);
}
}
for(int i = Max; i; --i) {
sol[i] = v[temp];
temp = pre[temp];
}
g << Max << "\n";
for(int i = 1; i <= Max; ++i)
g << sol[i] << " ";
g << "\n";
f.close();
g.close();
return 0;
}