Cod sursa(job #3354917)

Utilizator nicoleta_iancuIancu Nicoleta nicoleta_iancu Data 21 mai 2026 10:20:54
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#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;
}