Pagini recente » Cod sursa (job #2963156) | Cod sursa (job #2459406) | Cod sursa (job #307173) | Cod sursa (job #219606) | Cod sursa (job #1646969)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int V[100005],T[100005],R[100005],len=0,n;
stack<int> S;
int bs(int x){
int st=0;
int dr=len;
int mij;
while(st<=dr){
mij=(st+dr)/2;
if(x>V[T[mij]])
st=mij+1;
else dr=mij-1;
}
return st;
}
int main(){
int indx,x;
in>>n;
R[0]=-1;
T[0]=0;
for(int i=0;i<n;i++){
in>>V[i];
R[i]=-1;
}
for(int i=1;i<n;i++){
if(V[i]<V[T[0]]){ //! daca e mai mic decat prima valoare
T[0]=i;
}
else if(V[i]>V[T[len]]){ //! daca e mai mare decat ultima val(len)
T[++len]=i;
R[T[len]]=T[len-1];
}
else{ //! daca nu, binary search pentru pozitie
indx=bs(V[i]);
T[indx]=i;
R[T[indx]]=T[indx-1];
}
}
out<<len+1<<"\n";
x=T[len];
for(int i=0;i<=len;i++){
S.push(V[x]);
x=R[x];
}
while(!S.empty()){
out<<S.top()<<" ";
S.pop();
}
return 0;
}