Pagini recente » Cod sursa (job #144179) | Cod sursa (job #1721956) | Cod sursa (job #1872358) | Cod sursa (job #1458585) | Cod sursa (job #3343927)
#include<iostream>
#include<set>
#include<stack>
using namespace std;
#define NMAX 100001
int n,v[NMAX],pv[NMAX];
struct spair{
int idx,cnt;
friend bool operator<(const spair&s1,const spair&s2){
if(v[s1.idx]!=v[s2.idx])return v[s1.idx]<v[s2.idx];
if(s1.cnt!=s2.cnt)return s1.cnt<s2.cnt;
return s1.idx<s2.idx;
}
friend bool operator==(const spair&s1,const spair&s2){
return s1.idx==s2.idx&&s1.cnt==s2.cnt;
}
};
set<spair>dp;
signed main(){
#ifndef LOCAL
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
#endif // LOCAL
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
cin>>n;
for(int i=1;i<=n;++i){
cin>>v[i];
pv[i]=-1;
}
dp.insert({1,1});
int maxim=1,mi=1;
for(int i=2;i<=n;++i){
auto it=*dp.upper_bound({i,0x7fffffff});
if(it==*dp.begin()){
dp.insert({i,1});
continue;
}
auto nit=dp.find(it);
--nit;
if(v[i]==v[nit->idx]){
pv[i]=pv[nit->idx];
continue;
}
pv[i]=nit->idx;
if(nit->cnt+1>maxim){
maxim=nit->cnt+1;
mi=i;
}
dp.insert({i,nit->cnt+1});
}
cout<<maxim<<"\n";
stack<int>rsol;
while(pv[mi]>=0){
rsol.push(mi);
mi=pv[mi];
}
cout<<v[mi]<<" ";
for(;!rsol.empty();rsol.pop())cout<<v[rsol.top()]<<" ";
return 0;
}