Pagini recente » Cod sursa (job #1675008) | Cod sursa (job #2057731) | Cod sursa (job #1254576) | Cod sursa (job #1733995) | Cod sursa (job #3349995)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
vector<int> a;
int cautbin(vector<stack<pair<int,int>>> &s, int x){
int l=0, r = s.size()-1, ans=-1;
while(l <= r){
int mid = l+(r-l)/2;
if(s[mid].top().first >= x){
ans = mid;
r = mid-1;
}
else{
l = mid+1;
}
}
return ans;
}
vector<int> lis(vector<int> &v){
int n = v.size();
vector<stack<pair<int,int>>> s;
vector<int> pred(n, -1);
for(int i = 0; i<n; i++){
if(s.empty()){
s.push_back(stack<pair<int,int>>());
s.back().push({v[i], i});
continue;
}
int poz = cautbin(s, v[i]);
if(poz == -1){
pred[i] = s.back().top().second;
s.push_back(stack<pair<int,int>>());
s.back().push({v[i], i});
}
else {
if(poz > 0)
pred[i] = s[poz-1].top().second;
s[poz].push({v[i],i});
}
}
int cur = s.back().top().second;
vector<int> res;
while(cur != -1){
res.push_back(v[cur]);
cur = pred[cur];
}
reverse(res.begin(), res.end());
return res;
}
int main(){
fin >> n;
a.resize(n);
vector<int> ans;
for(int i = 0; i<n; i++){
fin >> a[i];
}
ans = lis(a);
fout << ans.size() << '\n';
for(int i : ans) fout << i << ' ';
return 0;
}