Cod sursa(job #2016027)

Utilizator amaliarebAmalia Rebegea amaliareb Data 28 august 2017 14:28:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>

using namespace std;
struct miau{int val,poz;} v[100005];
int n,i,j,d[100005],maxi,aint[400005],val,poz,a,b,sol[100005],m;
ifstream f("scmax.in");
ofstream g("scmax.out");

bool cmp(miau a, miau b)
{
    return a.val<b.val ||(a.val==b.val && a.poz>b.poz);
}

void update(int nod, int l, int r)
{
    int mid=(l+r)/2;
    if(l==r) aint[nod]=d[i];
    else
    {
        if(poz<=mid) update(2*nod,l,mid);
        else update(2*nod+1,mid+1,r);
        aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    }
}

void query(int nod, int l, int r)
{
    int mid=(l+r)/2;
    if(a<=l && b>=r) val=max(val,aint[nod]);
    else if(l!=r)
    {
        if(a<=mid) query(2*nod,l,mid);
        if(b>mid) query(2*nod+1,mid+1,r);
    }
}

int main()
{
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>v[i].val;
        v[i].poz=i;
    }
    sort(v+1,v+n+1,cmp);
    for(i=1;i<=n;i++)
    {
        val=0; a=1; b=v[i].poz-1;
        query(1,1,n);
        d[i]=val+1;
        poz=v[i].poz;
        update(1,1,n);
        if(d[i]>maxi) maxi=d[i];
    }
    g<<maxi<<'\n';
    val=2000000001;
    for(i=n;i>=1;i--)
    {
        if(d[i]==maxi && v[i].val<val)
        {
            sol[++m]=v[i].val;
            maxi--;
            val=v[i].val;
        }
    }
    for(i=m;i>=1;i--) g<<sol[i]<<' ';
    return 0;
}