Pagini recente » Cod sursa (job #3314483) | Borderou de evaluare (job #2493143) | Monitorul de evaluare | Cod sursa (job #3314921) | Cod sursa (job #3314502)
#include <bits/stdc++.h>
using namespace std;
const int Maxm=100005;
int v[Maxm], dp[Maxm];
int prec[Maxm];
int rez[Maxm];
int dr=0;
int main() {
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>v[i];
for(int i=1; i<=n; i++)
{
int st=1,dr2=dr;
if(dr==0)
{
dp[1]=i;
dr++;
}
else
{
while(st<dr2)
{
int mij=(st+dr2)/2;
if(v[dp[mij]]>=v[i])
{
dr2=mij-1;
}
else
st=mij+1;
}
if(v[dp[st]]<v[i])
{
if(dp[st+1]==0)
{
dp[st+1]=i;
dr++;
prec[i]=dp[st];
}
else if(v[dp[st+1]]>v[i])
{
dp[st+1]=i;
prec[i]=dp[st];
}
}
else if(v[dp[st]]>v[i])
{
dp[st]=i;
}
}
}
// for(int i=1;i<=n;i++)
// cout<<dp[i]<<" ";
int maxm=0,maxpoz=0;
for(int i=1;i<=n;i++)
{
if(dp[i]!=0)
{
maxpoz=dp[i];
maxm=i;
}
}
int y=0;
while(prec[maxpoz]!=0)
{
rez[y]=v[maxpoz];
y++;
maxpoz=prec[maxpoz];
}
rez[y]=v[maxpoz];
y++;
cout<<maxm<<endl;
for(int i=y-1;i>=0;i--)
cout<<rez[i]<<" ";
return 0;
}