Pagini recente » Cod sursa (job #115427) | Cod sursa (job #2572261) | Cod sursa (job #3136972) | Cod sursa (job #408259) | Cod sursa (job #887945)
Cod sursa(job #887945)
#include<cstdio>
#include<iostream>
#include<vector>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int N = 110000;
int n, x[N], p[N], s[N], pmax, aib[N], prec[N], pr[N];
vector<int> rez;
inline int query(int poz) {
int r = 0;
for(; poz; poz -= poz & (-poz)) {
if(aib[poz] > r)
pmax = pr[poz];
r = max(r, aib[poz]);
}
return r;
}
inline void update(int poz, int val, int po) {
for(; poz <= n; poz += poz & (-poz)) {
if(val > aib[poz])
pr[poz] = po;
aib[poz] = max(aib[poz], val);
}
}
bool cmp(int a, int b) {
return x[a] < x[b];
}
int main() {
int i;
in >> n;
for(i = 1; i<=n; ++i)
in >> x[i], p[i] = i;
sort(p + 1, p + n + 1, cmp);
int smax = 0, pm;
for(i = 1; i<=n; ++i) {
pmax = 0;
int t = query(p[i]);
s[p[i]] = t + 1;
prec[p[i]] = pmax;
update(p[i], t + 1, p[i]);
if(s[p[i]] > smax) {
smax = s[p[i]];
pm = p[i];
}
}
out << s[pm] << "\n";
int t = pm;
while(t > 0) {
rez.push_back(x[t]);
t = prec[t];
}
for(i = rez.size() - 1; i >= 0; --i)
out << rez[i] << " ";
return 0;
}