Cod sursa(job #2119927)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 1 februarie 2018 19:21:28
Problema Subsir crescator maximal Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 100000;
const int amax = 1 << 17;
int v[1+nmax];
int aint[amax+1];
int dp[1+nmax];
int init[1+nmax];

stack<int> s;

struct normalizare
{
    int val,poz;
    bool operator< (normalizare other) const{
        return val < other.val;
    }
} aux[1+nmax];

void update(int p,int x,int nod,int st,int dr)
{
    if(st == dr)
    {
        aint[nod] = max(aint[nod],x);
        return;
    }
    int mid = (st+dr)/2;
    if(p <= mid)
        update(p,x,nod*2,st,mid);
    else
        update(p,x,nod*2+1,mid+1,dr);
    aint[nod] = max(aint[nod*2],aint[nod*2+1]);
}

int query(int x,int nod,int st,int dr)
{
    if(st == dr)
        return 0;
    else
    {
       int mid = (st+dr)/2;
        if(x <= mid)
            return query(x,nod*2,st,mid);
        else
            return max(aint[nod*2],query(x,nod*2+1,mid+1,dr));
    }
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n;
    cin >> n;
    for(int i = 1;i <= n;i ++)
    {
        cin >> v[i];
        aux[i].val = v[i];
        aux[i].poz = i;
        init[i] = v[i];
    }
    sort(aux+1,aux+n+1);
    int ind = 0;
    for(int i = 1;i <= n;i ++)
    {
        if(aux[i].val != aux[i-1].val)
            ind ++;
        v[aux[i].poz] = ind;
    }
    dp[1] = 1;
    update(v[1],dp[1],1,1,amax);
    int sol = dp[1];
    int l;
    for(int i = 2;i <= n;i ++)
    {
        dp[i] = query(v[i],1,1,amax) + 1;
        update(v[i],dp[i],1,1,amax);
        if(dp[i] > sol)
        {
            sol = dp[i];
            l = i;
        }
    }
    s.push(init[l]);
    for(int i = l-1;i >= 1;i --)
    {
        if(v[i] < v[l])
        {
            l = i;
            s.push(init[l]);
        }
    }
    cout << sol << "\n";
    while(s.size() > 0)
    {
        cout << s.top() << " ";
        s.pop();
    }

    return 0;
}