Cod sursa(job #2008736)

Utilizator dragos231456Neghina Dragos dragos231456 Data 7 august 2017 15:11:46
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
struct r{
    int nr,pos;
}srt[100005];
int last=100001,mx,n,a[100005],arb[400005],ch,v[100005],m,rez[100005];
string s;

bool comp(r a, r b)
{
    if(a.nr==b.nr) return(a.pos>b.pos);
    return (a.nr<b.nr);
}

int nextint()
{
    int num=0;
    while(s[ch]==' ') ++ch;
    while(s[ch]<='9' && s[ch]>='0')
    {
        num=num*10+s[ch]-'0';
        ++ch;
    }
    return num;
}

void query(int nod,int lt,int rt,int x,int y)
{
    if(lt>y || rt<x) return;
    if(x<=lt && rt<=y)
    {
        m=max(m,arb[nod]);
        return;
    }
    int md=(lt+rt)/2;
    if(md>=x) query(nod*2,lt,md,x,y);
    if(md<y) query(nod*2+1,md+1,rt,x,y);
}

void update(int nod,int lt,int rt,int pos)
{
    if(lt==rt)
    {
        arb[nod]=m;
        return;
    }
    int md=(lt+rt)/2;
    if(pos<=md) update(nod*2,lt,md,pos);
    else update(nod*2+1,md+1,rt,pos);

    arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}

int main()
{
    f>>n; getline(f,s); getline(f,s);
    for(int i=1;i<=n;++i)
    {
        srt[i].nr=nextint();
        srt[i].pos=i;
    }
    sort(srt+1,srt+n+1,comp);
    for(int i=1;i<=n;++i) v[srt[i].pos]=i;
    for(int i=1;i<=n;++i)
    {
        m=0;
        query(1,1,n,1,v[i]); ++m;
        mx=max(mx,m);
        update(1,1,n,v[i]);
        a[i]=m;
    }
    m=mx;
    g<<mx<<'\n';
    for(int i=n;i>=1;--i)
    {
        if(a[i]==mx && v[i]<last)
        {
            rez[mx]=srt[v[i]].nr;
            --mx;
            last=v[i];
        }
    }
    for(int i=1;i<=m;++i) g<<rez[i]<<' ';
    return 0;
}