Pagini recente » Cod sursa (job #1023683) | Rating Moldovan Cristian Augustin (augustus) | Cod sursa (job #1197650) | Cod sursa (job #2269018) | Cod sursa (job #3182913)
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;
int v[100001],dp[100001],tata[100001],sol[100001];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void afisare(int k){
if(k!=0){
afisare(tata[k]); /// autoapelul
fout<<v[k]<<" ";
}
}
int main()
{
int n,k=0,nr=0;
fin>>n;
for(int i=1;i<=n;i++){
fin>>v[i];
/// caut binar pe v[i] in secventa 1... nr din dp
/// determin in p pozitia celui mai mic elem >=v[i]
/// nu gasesc elem => nr+, adaug la final
int st=1,dr=nr,p=0;
while(st<=dr){
int mid=(st+dr)/2;
if(v[dp[mid]]>=v[i]){
p=mid;
dr=mid-1;
}
else
st=mid+1;
}
if(p==0){
dp[++nr]=i;
tata[i]=dp[nr-1];
}
else{
dp[p]=i;
tata[i]=dp[p-1];
}
}
fout<<nr<<"\n";
afisare(dp[nr]);
/*iterativ
k=dp[nr];
int x=nr;
while(k!=0){
sol[nr]=v[k];
k=tata[k];
nr--;
}
for(int i=1;i<=x;i++)
fout<<sol[i]<<" ";*/
return 0;
}