Cod sursa(job #1512665)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 28 octombrie 2015 14:32:38
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <iostream>

using namespace std;
#define LE 100666

int Tree[LE*5],Scmax[LE],max_left,global_pos;

int bin_search(int value,int left,int right,int A[])
{
    if (left==right) return right;

    while (left<right)
    {
        int mid=(left+right+1)/2;

        if (A[mid]<=value) left=mid;
        else right=mid-1;
    }

    return right;
}

void update(int left,int right,int nod,int pos)
{
    if (left==right)
    {
        Tree[nod]=pos;
        return;
    }
    int mid=(left+right)/2;

    if (pos<=mid) update(left,mid,nod*2,pos);
    else update(mid+1,right,nod*2+1,pos);

   if (Scmax[Tree[nod*2]]>Scmax[Tree[nod*2+1]])
        Tree[nod]=Tree[nod*2];
    else
        Tree[nod]=Tree[nod*2+1];
}

void query(int left,int right,int nod,int X,int Y)
{
    if (left>=X&&right<=Y)
    {
        if (Scmax[Tree[nod]]>max_left) max_left=Scmax[Tree[nod] ],global_pos=Tree[nod];
        return;
    }

    int mid=(left+right)/2;
    if (X<=mid) query(left,mid,nod*2,X,Y);
    if (mid+1<=Y) query(mid+1,right,nod*2+1,X,Y);
}

ifstream f("scmax.in");
ofstream g("scmax.out");
#include <algorithm>
int a[LE],b[LE],last_pos[LE];

void Write(int pos)
{
    if (pos==0) return;
    Write(last_pos[pos]);
    g<<a[pos]<<" ";
}

int main()
{
    int i,n;
    f>>n;

    for(i=1; i<=n; ++i)
    {
        f>>a[i];
        b[i]=a[i];
    }

    sort(b+1,b+n+1);

    for(i=1; i<=n; ++i) a[i]=bin_search(a[i],1,n,b);
    //for(i=1;i<=n;++i) cout<<a[i]<<" ";

    //cout<<'\n'<<'\n';

    for(i=1; i<=n; ++i)
    {
        max_left=0;
        if (a[i]-1!=0)
           query(1,n,1,1,a[i]-1);
        Scmax[i]=Scmax[global_pos]+1;
        last_pos[i]=global_pos;
        update(1,n,1,i);
      //  cout<<"("<<i<<","<<max_left<<","<<Scmax[i]<<") "<<'\n';
    }

  //  cout<<'\n';




    int val_result=0,ind=0;

    for(i=1; i<=n; ++i)
        if (Scmax[i]>val_result)
            val_result=Scmax[i],ind=i;

    g<<val_result<<'\n';

    Write(ind);


    return 0;
}