Pagini recente » Cod sursa (job #2425193) | Cod sursa (job #2206087) | Cod sursa (job #1983820) | Cod sursa (job #1405963) | Cod sursa (job #3193006)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
const int NMAX=100005;
int n,cnt,fin,sfarsit;
int v[NMAX],dp[NMAX],ult[NMAX],parent[NMAX];
stack <int> s;
void parentt(int i)
{
if(parent[i])
parentt(parent[i]);
out<<v[i]<<" ";
}
int cautbin(int val)
{
int st=0;
int dr=cnt;
int mij=(st+dr)/2;
while(st<=dr)
{
if(v[ult[mij]]<val && v[ult[mij+1]]>=val)
{
return mij;
}
else if(v[ult[mij+1]]<val){
st=mij+1;
mij=(st+dr)/2;
}
else{
dr=mij-1;
mij=(st+dr)/2;
}
}
return cnt;
}
int main()
{
in>>n;
for(int i=1; i<=n; i++)
in>>v[i];
dp[1]=1;
ult[1]=1;
int poz;
cnt=1;
for(int i=2; i<=n; i++)
{
poz=cautbin(v[i]);
dp[i]=poz+1;
parent[i]=ult[poz];
cnt=max(cnt,poz+1);
ult[poz+1]=i;
}
for(int i=1; i<=n; i++)
{
if(dp[i]>fin)
{
fin=dp[i];
sfarsit=i;
}
}
out<<fin<<'\n';
parentt(sfarsit);
return 0;
}