Cod sursa(job #397926)

Utilizator alexandru92alexandru alexandru92 Data 17 februarie 2010 18:37:48
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <algorithm>
#define Nmax 100011

/*
 *
 */
 using namespace std;
 int N;
 int v[Nmax], v2[Nmax], idx[Nmax], dp[Nmax], aib[Nmax], father[Nmax];
 void UpDate( int x, int y )
 {
     for( ; x <= N; x+=( x & -x ) )
        if( dp[aib[x]] < dp[y] )
            aib[x]=y;
 }
 int QueRy( int x )
 {
     int idx=0;
     for( ; x; x-=( x & -x ) )
        if( dp[aib[x]] > dp[idx] )
            idx=aib[x];
     return idx;
 }
 int search( int x, int idx )
 {int tidx, i=0;
     for( ; idx; idx>>=1 )
     {
         tidx=i+idx;
         if( tidx <= N && v2[tidx] <= x )
            i=tidx;
     }
     return i;
 }

 int main( void )
 {
     int i, max, stop;
     ifstream in("scmax.in");
     in>>N;
     for( i=1; i <= N; ++i )
     {
         in>>v[i];
         v2[i]=v[i];
     }
     sort( v2+1, v2+N+1 );
     for( stop=1; stop <= N; stop<<=1 );
     for( i=1; i <= N; ++i )
         idx[i]=search( v[i], stop );
     for( max=i=1; i <= N; ++i )
     {
         father[i]=QueRy( idx[i]-1 );
         dp[i]=dp[father[i]]+1;
         UpDate( idx[i], i );
         if( dp[i] > dp[max] )
            max=i;
     }
     for( i=max, max=0; i; i=father[i], ++max )
        v2[max]=v[i];
     ofstream out("scmax.out");
     out<<max<<'\n';
     for( i=max-1; i >= 0; --i )
        out<<v2[i]<<' ';
     return 0;
 }