Pagini recente » Diferente pentru utilizator/stargold2 intre reviziile 275 si 57 | Cod sursa (job #1667939) | Istoria paginii utilizator/ionuttiplea2001 | Diferente pentru utilizator/ionanghelina intre reviziile 14 si 15 | Cod sursa (job #442743)
Cod sursa(job #442743)
#include <fstream>
#include <list>
#include <vector>
#include <algorithm>
#include <stack>
#include <iostream>
using namespace std;
struct compara{
int pos;
vector<int> &numere;
compara(int pos_,vector<int> &numere_):pos(pos_),numere(numere_){}
};
bool operator<(const compara& a,const compara& b){
return a.numere[a.pos]<b.numere[b.pos];
}
int main(){
ifstream in("scmax.in");
ofstream out("scmax.out");
int n;in>>n;
vector<int> numere(n);
vector<int> pred(n,-1);
vector<int> marime(n,1);
for(int i=0;i<n;i++) in>>numere[i];
list<compara> pos;
int maxim=0;
for(int i=0;i<n;i++){
compara temp(i,numere);
list<compara>::iterator t,it=lower_bound(pos.begin(),pos.end(),temp);
if(it!=pos.begin()){
list<compara>::iterator prev=it;prev--;
t=lower_bound(pos.begin(),pos.end(),*prev);
t;
prev=t;
marime[i]=marime[prev->pos]+1;
pred[i]=prev->pos;
pos.insert(it,temp);
if(marime[i]>marime[maxim]) maxim=i;
}else{
pos.insert(it,temp);
}
}
out<<marime[maxim]<<endl;
stack<int> s;
do{
s.push(numere[maxim]);
maxim=pred[maxim];
}while(maxim!=-1);
while(!s.empty()){
out<<s.top()<<" ";
s.pop();
}
}