Cod sursa(job #1956484)

Utilizator AlexandruRudiAlexandru Rudi AlexandruRudi Data 6 aprilie 2017 19:46:27
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define dbg(x) cout << #x << '=' << x << '\n';
#define ll long long
#define pi pair<int,int>
#define pl pair<long long,long long>
#define rd(x) cin >> x;
#define rda(a,n) for(int i=1;i<=n;i++) cin >> a[i];
#define wr(x) cout << x << ' ';
#define wrl(x) cout << x << '\n';
#define wra(a,n) for(int i=1;i<=n;i++) cout << a[i] << ' '; cout << '\n';
#define lg length()
#define pb(x) push_back(x)
ifstream in("infasuratoare.in");
ofstream out("infasuratoare.out");
#define MAXN 100005
#define INF 1000000005
#define LINF 1000000000000000005
struct comp{
    bool operator()(int a, int b){
        return a>b;
    }
};

int n,a[100005],aint[400005],dp[100005],ans,x[100005],t;
vector <int> p;

void Init(int nod,int l, int r){
    aint[nod]=2e9+5;
    if(l==r) return;
    Init(2*nod,l,(l+r)/2);
    Init(2*nod+1,(l+r)/2+1,r);
}

void Upd(int nod, int l, int r, int pos, int val){
    if(l>pos || r<pos) return;
    if(l==r){
        aint[nod]=val; return;
    }
    Upd(2*nod,l,(l+r)/2,pos,val);
    Upd(2*nod+1,(l+r)/2+1,r,pos,val);
    aint[nod]=min(aint[2*nod],aint[2*nod+1]);
}

int Qry(int nod, int l, int r, int val){
    if(l==r) {
        if(aint[nod]<val)
            return l;
        else
            return 0;
    }
    if(aint[2*nod+1]>=val) return Qry(2*nod,l,(l+r)/2,val);
    else return Qry(2*nod+1,(l+r)/2+1,r,val);
}

int main(){
    //ios_base :: sync_with_stdio(0);
    cin >> n;
    for(int i=1;i<=n;i++) cin >> a[i];
    Init(1,1,n);
    for(int i=1;i<=n;i++){
        int p=Qry(1,1,n,a[i]);
        dp[i]=dp[p]+1;
        x[i]=p;
        Upd(1,1,n,i,a[i]);
        if(dp[i]>=ans) ans=dp[i],t=i;
    }
    cout << ans << '\n';
    while(t) p.pb(a[t]),t=x[t];
    for(int i=p.size()-1;i>=0;i--) cout << p[i] << ' ';
}