Pagini recente » Cod sursa (job #2496567) | Cod sursa (job #1729919) | Cod sursa (job #2406667) | Cod sursa (job #1940775) | Cod sursa (job #2919872)
#include<bits/stdc++.h>
using namespace std;
#define INIT ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
#define int ll
ifstream fin("scmax.in"); ofstream fout("scmax.out");
#define cin fin
#define cout fout
int n, a[300010];
class Node{
public: int a;
public: Node *p;
public: Node(int a, Node *p){
this->a=a;
this->p=p;
}
};
Node *b[100010];
int32_t main(){
INIT
cin>>n;
for(int i=1; i<=n ;i++){
cin>>a[i];
}
/*
Node *c=new Node(1, nullptr);
Node *d=new Node(2, nullptr);
cout<<c->a<<" "<<d->a<<"\n";
d=c;
cout<<c->a<<" "<<d->a<<"\n";
c=new Node(3, nullptr);
cout<<c->a<<" "<<d->a<<"\n";
*/
int len=0;
b[0]=nullptr;
for(int i=1; i<=n; i++){
int l=0, r=(len+1);
int mid=(l+r)>>1ll;
while(l<r){
if((mid==0) || a[i]>b[mid]->a ){
l=mid+1;
}
else{
r=mid;
}
mid=(l+r>>1ll);
}
if(mid==(len+1) || b[mid]->a>=a[i]){
mid--;
}
b[mid+1]= new Node(a[i], b[mid]);
len=max(mid+1, len);
}
cout<<len<<"\n";
vector<int> vec;
Node *ac=b[len];
while(ac){
vec.pb(ac->a);
ac=ac->p;
}
for(int i=vec.size()-1; i>=0; i--){
cout<<vec[i]<<" ";
}
return 0;
}