Cod sursa(job #3182913)

Utilizator AlexandraVarutuValexandra AlexandraVarutu Data 10 decembrie 2023 11:22:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <climits>
using namespace std;
int v[100001],dp[100001],tata[100001],sol[100001];
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void afisare(int k){
  if(k!=0){
      afisare(tata[k]);  /// autoapelul
      fout<<v[k]<<" ";
  }
}
int main()
{
    int n,k=0,nr=0;
    fin>>n;
    for(int i=1;i<=n;i++){
        fin>>v[i];
        /// caut binar pe v[i] in secventa 1... nr din dp
        /// determin in p pozitia celui mai mic elem >=v[i]
        /// nu gasesc elem => nr+, adaug la final
        int st=1,dr=nr,p=0;
        while(st<=dr){
            int mid=(st+dr)/2;
            if(v[dp[mid]]>=v[i]){
                p=mid;
                dr=mid-1;
            }
            else
                st=mid+1;
        }
        if(p==0){
            dp[++nr]=i;
            tata[i]=dp[nr-1];
        }
        else{
            dp[p]=i;
            tata[i]=dp[p-1];
        }
    }
    fout<<nr<<"\n";
     afisare(dp[nr]);
    /*iterativ
    k=dp[nr];
    int x=nr;
    while(k!=0){
        sol[nr]=v[k];
        k=tata[k];
        nr--;
    }
    for(int i=1;i<=x;i++)
         fout<<sol[i]<<" ";*/
    return 0;
}