Pagini recente » Cod sursa (job #3230248) | Cod sursa (job #441565) | Cod sursa (job #2039732) | Cod sursa (job #2939409) | Cod sursa (job #3354928)
#include<fstream>
#include<iostream>
#include<vector>
#define inf 2000000000
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int>parent;
vector<int>v;
vector<int>rez;
const int NMAX= 100001;
pair<int,int> dp[NMAX];
void rec(int &poz){
if(poz==-1){
return;
}
rez.push_back(v[poz]);
rec(parent[poz]);
}
int lungMax;
pair<int,int> cb(int valCrt,int poz){
int st=1;
int dr=poz;
int mij;
lungMax=0;
pair<int,int> rez=make_pair(0,-1);
while (st<=dr)
{
mij=(st+dr)/2;
if(dp[mij].first<valCrt){
rez=dp[mij];
lungMax=mij;
st=mij+1;
}else{
dr=mij-1;
}
}
return rez;
}
int main(){
int n;
fin>>n;
v.resize(n);
for(int i=0;i<n;++i){
fin>>v[i];
}
for(int i=0;i<=n;++i){
dp[i]=make_pair(inf,-1);
}
vector<int>lung(n);
parent.resize(n);
parent[0]=-1;
pair<int,int>answr;
for(int i=0;i<n;++i){
answr=cb(v[i],i);
parent[i]=answr.second;
lung[i]=1+lungMax;
if(dp[lung[i]].first>v[i]){
dp[lung[i]]=make_pair(v[i],i);
}
}
int final=0;
int maxi=0;
for(int i=0;i<n;++i){
if(lung[i]>maxi){
final=i;
maxi=lung[i];
}
}
fout<<maxi<<"\n";
rec(final);
for(int i=rez.size()-1;i>=0;--i){
fout<<rez[i]<<" ";
}
return 0;
}