Cod sursa(job #364459)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 15 noiembrie 2009 20:09:46
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
//subsir crescator maximal cu AIB

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

#define nm 100005
#define lsb(x)(((x)^(x-1))&(x))
#define pb push_back

int A[nm],AIB[nm],DAIB,N,B[nm],W[nm];

vector<int> nrml;

int query(int poz)
{
     int ans=0;
     
     while(poz)
     {
       ans=max(ans,AIB[poz]);
       poz-=lsb(poz);
     }
     
     return ans;
}

void update(int poz,int val)
{
     while(poz<=DAIB)
     {
       AIB[poz]=max(AIB[poz],val);
       poz+=lsb(poz);
     }
}

int main()
{
    int best=0;
    
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    
    scanf("%d",&N);
    
    for(int i=1;i<=N;++i)
    {
      scanf("%d",&A[i]); 
      nrml.pb(A[i]);
    }   
    
    //trebuie normalizat
    
    nrml.pb(-1);
    sort(nrml.begin(),nrml.end());
    
    DAIB=0;
    
    for(int i=1;i<=N;++i)
      if(nrml[i]!=nrml[i-1])
      {
         ++DAIB;    
         W[nrml[i]]=DAIB;
      }   
      
    for(int i=1;i<=N;++i)
    {
       B[i]=query(W[A[i]]-1)+1;
       update(W[A[i]],B[i]);
       if(B[i]>best) best=B[i];
    }    
    
    int mm=2000000001,ce=best;
    
    for(int i=N;i>=1 && ce;--i)
      if(B[i]==ce && A[i]<mm)
      {
        W[ce]=A[i];
        --ce;
        mm=A[i];
      }
      
    printf("%d\n",best);
    
    for(int i=1;i<=best;++i)
      printf("%d ",W[i]);  
    
    return 0;
}