Pagini recente » Cod sursa (job #2135102) | Cod sursa (job #1549146) | Cod sursa (job #2620835) | Cod sursa (job #2551740) | Cod sursa (job #2802325)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
long long aib[100001];
long long val[100001],v[100001],best[100001];
long long n;
pair<long long,pair<long long,long long>>p[100001];
vector<long long>vv[100001];
stack<long long>st;
bool cmp(pair<long long,pair<long long,long long>>a,pair<long long,pair<long long,long long>>b)
{
return a.second.second<b.second.second;
}
void norm(long long v[],long long n)
{
for(long long i=1;i<=n;i++)
p[i].first=v[i];
for(long long i=1;i<=n;i++)
p[i].second.second=i;
sort(p+1,p+n+1);
long long nr=0;
for(long long i=1;i<=n;i++)
if(p[i].first!=p[i-1].first)
p[i].second.first=++nr;
else p[i].second.first=nr;
sort(p+1,p+n+1,cmp);
for(long long i=1;i<=n;i++)
{
val[p[i].second.first]=p[i].first;
v[i]=p[i].second.first;
}
}
void update(long long val,long long poz)
{
if(poz==0)
return;
while(poz<=n)
{
aib[poz]=max(aib[poz],val);
poz+=(poz&(-poz));
}
}
long long query(long long poz)
{
long long maxi=0;
while(poz>0)
{
maxi=max(maxi,aib[poz]);
poz-=(poz&(-poz));
}
return maxi;
}
int main()
{
fin>>n;
for(long long i=1;i<=n;i++)
fin>>v[i];
norm(v,n);
for(long long i=1;i<=n;i++)
{
best[v[i]]+=max(0,query(v[i]-1)+1-best[v[i]]);
update(best[v[i]],v[i]);
}
for(long long i=1;i<=n;i++)
if(best[v[i]]!=0)
vv[best[v[i]]].push_back(v[i]);
long long i;
for(i=1;vv[i].size()>0;i++);
i--;
sort(vv[i].begin(),vv[i].end());
st.push(vv[i][vv[i].size()-1]);
i--;
while(i>0)
{
for(long long p=0;p<vv[i].size();p++)
if(vv[i][p]<st.top()&&val[vv[i][p]]<val[st.top()])
{
st.push(vv[i][p]);
break;
}
i--;
//cout<<i<<" ";
}
fout<<st.size()<<"\n";
while(!st.empty())
{
fout<<val[st.top()]<<" ";
st.pop();
}
}