Pagini recente » Cod sursa (job #405192) | Cod sursa (job #1340197) | Cod sursa (job #1301151) | Cod sursa (job #609747) | Cod sursa (job #2029133)
#include <fstream>
#include <algorithm>
#include <vector>
#define zeros(x) (x & -x)
#define MAX 100005
using namespace std;
int n, aib[MAX], a[MAX], l[MAX], v[MAX], d[MAX], p[MAX];
void update(int pos, int val) {
for(int i = pos; i <= n; i += zeros(i))
if(d[aib[i]] < d[val])
aib[i] = val;
}
int query(int pos) {
int res = 0;
for(int i = pos; i > 0; i -= zeros(i))
if(d[res] < d[aib[i]])
res = aib[i];
return res;
}
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
f >> n;
for(int i = 1; i <= n; ++i)
f >> a[i];
l[1] = a[1];
int h = 1;
for(int i = 2; i <= n; ++i)
if(a[i] != l[h])
l[++h] = a[i];
sort(l + 1, l + h + 1);
for(int i = 1; i <= n; ++i)
v[i] = lower_bound(l + 1, l + h + 1, a[i]) - l;
for(int i = 1; i <= n; ++i) {
p[i] = query(v[i] - 1);
d[i] = d[p[i]] + 1;
update(v[i], i);
}
int res = 0;
for(int i = 1; i <= n; ++i)
if(d[res] < d[i])
res = i;
g << d[res] << "\n";
vector<int> vres;
while(res) {
vres.push_back(a[res]);
res = p[res];
}
for(int i = vres.size() - 1; i >= 0; --i)
g << vres[i] << " ";
return 0;
}