Cod sursa(job #2026792)

Utilizator Johnny07Savu Ioan-Daniel Johnny07 Data 25 septembrie 2017 00:24:34
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");

int n, sol,b[100010],tree[4000040],c[100010];

struct st
{
    int val, poz;
}a[100010];

bool comp1 (st x, st y)
{
    return (x.val<y.val);
}

bool comp2(st x, st y)
{
    return (x.poz<y.poz);
}

void solve (int nod, int st, int dr, int x)
{
int mid=st+dr;
mid/=2;
if (st!=dr)
{
if (mid<x)
{
    solve (nod*2+1, mid+1, dr, x);
    tree[nod]=max(tree[nod*2+1],tree[nod*2]+1);
    sol=max(sol,tree[nod]);
}
else
{
    solve (nod*2, st, mid, x);
    tree[nod]=max(tree[nod],tree[nod*2]);
}
}

else
{
    tree[nod]=1;
}

}



int main()
{
    int i;
f>>n;
for (i=1;i<=n;i++)
{
f>>a[i].val;
c[i]=a[i].val;
a[i].poz=i;
}
sort (a+1,a+n+1, comp1);
int x=1;
int aux=a[1].val;
a[1].val=1;
for (i=2;i<=n;i++)
{
    if (a[i].val==aux) a[i].val=x;
    else {aux=a[i].val;x++;a[i].val=x;}
}
sort (a+1,a+n+1,comp2);


    for (i=1;i<=n;i++){
    sol=1;
    solve(1, 1, n, a[i].val);
    b[i]=sol;
    }
    sol=0;
for (i=1;i<=n;i++) sol=max(sol, b[i]);
g<<sol<<"\n";
aux=2000000010;
int auxs=sol;
for (i=n;i>=1;i--)
{
    if (b[i]==sol && aux>c[i]) {aux=c[i];sol--;a[sol+1].val=c[i];}
}
for (i=1;i<=auxs;i++) g<<a[i].val<<" ";

    return 0;
}