Cod sursa(job #2919872)

Utilizator OvidRata Ovidiu Ovid Data 20 august 2022 14:03:39
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#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;
}