Pagini recente » Cod sursa (job #2529087) | Cod sursa (job #1223630) | Cod sursa (job #2685292) | Cod sursa (job #1364822) | Cod sursa (job #2971158)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
inline int lsb(int x) {
return x & (-x);
}
int n;
int len[nmax+5], ind[nmax+5];
int v[nmax+5];
int mx[nmax+5], prv[nmax+5];
pair<int, int> query(int pos) {
pair<int, int> temp = {0, 0};
for(int i=pos; i>=1; i-=lsb(i))
if(len[i] > temp.first) {
temp.first = len[i];
temp.second = ind[i];
}
return temp;
}
void update(int pos, int val, int w) {
for(int i=pos; i<=n; i+=lsb(i))
if(val > len[i]) {
len[i] = val;
ind[i] = w;
}
}
int main() {
ifstream f("scmax.in");
ofstream g("scmax.out");
f >> n;
vector<int> vals;
for(int i=1; i<=n; i++) {
f >> v[i];
vals.emplace_back(v[i]);
}
sort(vals.begin(), vals.end());
vals.erase(unique(vals.begin(), vals.end()), vals.end());
int ans = -1, pos;
for(int i=1; i<=n; i++) {
int norm = lower_bound(vals.begin(), vals.end(), v[i]) - vals.begin() + 1;
auto temp = query(norm-1);
mx[i] = temp.first + 1;
prv[i] = temp.second;
update(norm, mx[i], i);
if(mx[i] > ans) {
ans = mx[i];
pos = i;
}
}
vector<int> scmax;
while(pos != 0) {
scmax.emplace_back(v[pos]);
pos = prv[pos];
}
reverse(scmax.begin(), scmax.end());
g << scmax.size() << "\n";
for(auto i : scmax) g << i << " ";
return 0;
}