Pagini recente » Cod sursa (job #401147) | Cod sursa (job #367654) | Cod sursa (job #683366) | Cod sursa (job #640722) | Cod sursa (job #2916224)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int i, j, n, m, L, st, dr, mid, aux, k;
int v[100005], D[100005], t[100005], x[100005];
int main(){
cin>>n;
for(i=1;i<=n;i++){
cin>>v[i];
}
/// sursa complexitate nlog(n)
/// La un pas i avem L = lungimea maxima a unui subsir crescator cu elemente de pe pozitii <=i
/// la pas i tinem un vector D cu L elemente (indici din v) in care
/// v[D[j]] = val minima dintre pozitiile 1 si i in care se termina un subsir crescator de lungime j
for(i=1;i<=n;i++){
if(v[i]>v[D[L]])
D[++L]=i, t[D[L]]=D[L-1];
else{
st=1;
dr=L;
while(st<=dr){
mid=(st+dr)/2;
if(v[i]>v[D[mid]])
st=mid+1;
else
dr=mid-1;
}
D[dr+1]=i;
t[D[dr+1]]=D[dr];
}
}
cout<<L<<"\n";
aux=D[L];
while(aux){
x[++k]=aux;
aux=t[aux];
}
for(i=k;i>=1;i--)
cout<<v[x[i]]<<" ";
}