Pagini recente » Cod sursa (job #2541801) | Cod sursa (job #598492) | Cod sursa (job #3234256) | Cod sursa (job #2218500) | Cod sursa (job #2641442)
#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int ANS,n,POZ,a[100010],b[100010],ans[100010],aib[100010];
vector<pair<int,int> > v;
vector<int> V;
int get_max(int val){
if(!val)return 0;
int ret=0;
for(;val;val-=val&-val)
ret=max(ret,aib[val]);
return ret;
}
void upd(int poz,int val){
for(;poz<=n;poz+=poz&-poz)
aib[poz]=max(aib[poz],val);
return ;
}
int main(){
f>>n;
for(int i=1;i<=n;i++){
f>>a[i];b[i]=a[i];
v.push_back({a[i],i});
}
sort(v.begin(),v.end());
a[v[0].second]=1;
for(int i=1;i<n;i++)
if(v[i].first==v[i-1].first)
a[v[i].second]=a[v[i-1].second];
else
a[v[i].second]=i+1;
for(int i=1;i<=n;i++){
ans[i]=get_max(a[i]-1)+1;
upd(a[i],ans[i]);
ANS=max(ANS,ans[i]);
}
for(int i=1;i<=n;i++)
if(ans[i]==ANS)
POZ=i;
g<<ANS<<'\n';
V.push_back(b[POZ]);
for(int i=POZ-1;i;i--){
if(a[i]<a[POZ]&&ans[i]==ans[POZ]-1){
V.push_back(b[i]);
POZ=i;
}
}
reverse(V.begin(),V.end());
for(auto it:V)
g<<it<<' ';
}