Pagini recente » Cod sursa (job #27518) | Cod sursa (job #1221317) | Cod sursa (job #1401730) | Cod sursa (job #718966) | Cod sursa (job #2791639)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int aib[100001];
int val[100001],v[100001],best[100001];
int n;
pair<int,pair<int,int>>p[100001];
vector<int>vv[100001];
stack<int>st;
bool cmp(pair<int,pair<int,int>>a,pair<int,pair<int,int>>b)
{
return a.second.second<b.second.second;
}
void norm(int v[],int n)
{
for(int i=1;i<=n;i++)
p[i].first=v[i];
for(int i=1;i<=n;i++)
p[i].second.second=i;
sort(p+1,p+n+1);
int nr=0;
for(int 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(int i=1;i<=n;i++)
{
val[p[i].second.first]=p[i].first;
v[i]=p[i].second.first;
}
}
void update(int val,int poz)
{
if(poz==0)
return;
while(poz<=n)
{
aib[poz]=max(aib[poz],val);
poz+=(poz&(-poz));
}
}
int query(int poz)
{
int maxi=0;
while(poz>0)
{
maxi=max(maxi,aib[poz]);
poz-=(poz&(-poz));
}
return maxi;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>v[i];
norm(v,n);
for(int 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(int i=1;i<=n;i++)
if(best[v[i]]!=0)
vv[best[v[i]]].push_back(v[i]);
int 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(int 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();
}
}