Pagini recente » Cod sursa (job #3335659) | Cod sursa (job #91894) | Cod sursa (job #3337387) | Cod sursa (job #2264133) | Cod sursa (job #3354917)
#include<fstream>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int>parent;
vector<int>v;
vector<int>sortat;
vector<int>rez;
vector<pair<int,int>>aib;
int lsb(int &x){
return x&(-x);
}
void update(int poz,int val,int origin){
poz++;
for(int i=poz;i<aib.size();i+=lsb(i)){
if(aib[i].first<val){
aib[i].first=val;
aib[i].second=origin;
}
}
}
int pozOK=0;
pair<int, int> query(int poz){
pair<int, int> best = {0, -1};
poz++;
for(int i=poz;i>0;i-=lsb(i)){
if(best.first<aib[i].first){
best=aib[i];
pozOK=i;
}
}
return best;
}
void rec(int &poz){
if(poz==-1){
return;
}
rez.push_back(v[poz]);
rec(parent[poz]);
}
int main(){
int n;
fin>>n;
v.resize(n);
aib.resize(n+1,make_pair(0,0));
sortat.resize(n);
for(int i=0;i<n;++i){
fin>>v[i];
sortat[i]=v[i];
}
sort(sortat.begin(),sortat.end());
sortat.erase(unique(sortat.begin(), sortat.end()), sortat.end());
vector<int>lung(n);
parent.resize(n);
parent[0]=-1;
pair<int,int>best_prev;
for(int i=0;i<n;++i){
auto it=lower_bound(sortat.begin(),sortat.end(),v[i]);
int ind=it-sortat.begin();
if (ind != 0) {
best_prev = query(ind - 1);
lung[i] = best_prev.first;
} else {
lung[i] = 0;
}
lung[i]++;
update(ind,lung[i],i);
if (lung[i] == 1) {
parent[i] = -1;
} else {
parent[i] = best_prev.second;
}
}
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;
}