Cod sursa(job #2741540)

Utilizator MateGMGozner Mate MateGM Data 16 aprilie 2021 13:23:40
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <map>

using namespace std;

ifstream be("scmax.in");
ofstream ki("scmax.out");

/*void build_arr(vector<int>&a,int n)
{
    set<int>s;
    for(int i=0;i<n;i++)
        s.insert(a[i]);
    int idx=0;
    map<int,int>mp;
    set<int>::iterator it;
    for( it = s.begin();it!=s.end();it++)
    {
        idx++;
        mp[*it]=idx;
    }
    for(int i=0;i<n;i++)
        a[i]=mp[a[i]];
}

int query(vector<int> &bitr,int idx)
{
    int s=0;
    int i=0;
    while(idx>0)
    {
        s=max(s,bitr[idx]);
        idx-=idx&(-idx);
    }
    return s;

}

void update(vector<int>&bitr,int idx,int n)
{
    int x=query(bitr,idx-1);
    int val=x+1;
    while(idx<=n)
    {
        bitr[idx]=max(bitr[idx],val);
        idx=idx+(idx&(-idx));
    }
}
*/
int binkeres(vector<int>&a,vector<int>&t,int l,int r,int x)
{
    while(r-l>1)
    {
        int m=l+(r-l)/2;
        if(a[t[m]]>=x)
            r=m;
        else
            l=m;
    }
    return r;

}

void lis(vector<int>&a,int n)
{
    vector<int>idx(n,0);
    vector<int>idxprev(n,-1);
    vector<int>sol(n);
    int len=1;
    for(int i=1;i<n;i++){
        if(a[i]<a[idx[0]])
            idx[0]=i;
        else if(a[i]>a[idx[len-1]])
        {
            idxprev[i]=idx[len-1];
            idx[len++]=i;
        }
        else{
            int pos=binkeres(a,idx,-1,len-1,a[i]);
            idxprev[i]=idx[pos-1];
            idx[pos]=i;

        }
    }
    ki<<len<<endl;
    int k=0;
    for(int i=idx[len-1];i>=0;i=idxprev[i])
    {
        sol[k++]=a[i];
    }
    for(int i=len-1;i>=0;i--)
        ki<<sol[i]<<" ";
    ki<<endl;
}


int main()
{

    int n;
    be>>n;
    vector<int>a(n+1,0);
    for(int i=0;i<n;i++)
    {
        int x;
        be>>x;
        a[i]=x;
    }
    lis(a,n);
    return 0;
}