Cod sursa(job #3364527)

Utilizator Alexandru_OrzeaOrzea Alexandru Alexandru_Orzea Data 5 septembrie 2026 10:37:12
Problema Subsir crescator maximal Scor 75
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <fstream>
#include <iostream>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

long long n, mx, dp[100005], m[100005], sir[100005], poz, z, sir2[100005];

int cautare_binara(int mx, long long x){
    int left = 0;
    int right = mx;
    
    while(left < right){
    int middle = (left+right)/2;
    
    
    if(sir[middle] == x)
    return middle;
    
    else if(sir[middle] < x)
    left = middle+1;
    
    else
    right = middle-1;
    
    }
    
    if(sir[left] >= x)
    return left;
    
    else
    return left+1;
}



int main()
{
    f>>n;
    
    for(int i=0; i<n; i++){
        f>>m[i];
        
        dp[i] = cautare_binara(mx, m[i]);
        
        if(sir[dp[i]] > m[i] || sir[dp[i]] == 0)
        sir[dp[i]] = m[i];
        
        if(dp[i] > mx){
            mx = dp[i];
            poz = i;
        }
        
        }
    
    g<<mx<<'\n';
    
    sir2[0] = m[poz];
    for(z=1; z<mx; z++){
        sir2[z] = 2000000001;
        
    for(int i=poz-1; i>=0; i--)
    if(dp[i] == mx-z && sir2[z-1] > m[i]){ 
        
    sir2[z] = min(sir2[z], m[i]);
    poz = i;
    
    }
}
    
    
    for(int i=z-1; i>=0; i--)
    g<<sir2[i]<<' ';

    return 0;
}