Pagini recente » Cod sursa (job #1997790) | Cod sursa (job #2810994) | Cod sursa (job #3192868) | Cod sursa (job #1417418) | Cod sursa (job #1090043)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int N = 100001;
int v[N], w[N], x[N], n, i, aib[N], lung, imax, maxim, final[N], l[N];
bool cmp(int p1, int p2){
return v[p1] < v[p2];
}
void update(int p, int val){
while(p <= n){
if(aib[p] < val){
aib[p] = val;
}
p += p&(-p);
}
}
int query(int val){
int s = 0;
while(val){
if(aib[val] > s){
s = aib[val];
}
val -= val & (-val);
}
return s+1;
}
int main()
{
in >> n;
for(i = 1; i <= n; i++){
in >> v[i];
w[i] = i;
}
sort(w+1, w+n+1, cmp);
for(i = 1; i <= n; i++){
if(i > 1 && v[w[i]] == v[w[i-1]]){
x[w[i]] = x[w[i-1]];
} else {
x[w[i]] = i;
}
}
for(i = 1; i <= n; i++){
lung = query(x[i]-1);
if(lung > maxim){
maxim = lung;
imax = i;
}
update(x[i], lung);
l[i] = lung;
}
/*for(i = 1; i <= n; i++){
out << x[i] << " ";
}*/
lung = maxim;
int ceva = 0;
final[ceva] = v[imax];
for(i = n; i >= 1; i--){
if(l[i] == lung-1){
final[++ceva] = v[i];
lung--;
}
}
out << maxim << "\n";
for(i = maxim-1; i >= 0; i--){
out << final[i] << " ";
}
return 0;
}