Pagini recente » Cod sursa (job #1478781) | Cod sursa (job #147636) | Cod sursa (job #1283216) | Borderou de evaluare (job #1900510) | Cod sursa (job #2304593)
#include<fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,m,i,j,k,st,dr,mid,r;
int v[100005],d[100005],sol[100005],t[100005];
int main(){
fin>>n;
for(i=1;i<=n;i++){
fin>>v[i];
}
d[1]=1;
k=1;
for(i=2;i<=n;i++){
///cautare binara in d
///caut cea mai mare valoare mai mica decat v[i]
st=1;
dr=k;
while(st<=dr){
mid=(st+dr)/2;
if(v[d[mid]]>=v[i]){
dr=mid-1;
}
else{
st=mid+1;
}
}
if(st>k){
k++;
d[k]=i;
t[i]=d[st-1];
}
else{
d[st]=i;
t[i]=d[st-1];
}
}
int q=d[k];
sol[++r]=d[k];
while(t[q]!=0){
q=t[q];
sol[++r]=q;
}
sol[++r]=q;
fout<<k<<"\n";
for(i=1;i<=k;i++){
fout<<v[sol[k-i+1]]<<" ";
}
return 0;
}