Cod sursa(job #2614086)

Utilizator bem.andreiIceman bem.andrei Data 11 mai 2020 11:15:08
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("scmax.in");
ofstream w("scmax.out");
int g[100001], aib[100001], d[100001], rasp[100001], n;
struct normalizare{
    int val, ind;
}v[100001];
bool cmp(normalizare &a, normalizare &b){
    if(a.val<b.val){
        return true;
    }
    if(a.val>b.val){
        return false;
    }
    if(a.ind>b.ind){
        return true;
    }
    return false;
}
//De ce aib ia doar 70 de puncte din cauza serverului????
//NU e corect!!!!
//Vreau 100 cu aib, explicatii?
//Ha, o sa te fac
void update(int a, int b){
    aib[a]=max(aib[a], b);
    if(a+ (a & -a)>n){
        return ;
    }
    update(a+ (a & -a), b);
}
int querry(int a){
    if(a - (a & -a) == 0){
        return aib[a];
    }
    return max(aib[a],querry(a - (a & -a)));
}
int main()
{
    r>>n;
    for(int i=1;i<=n;i++){
        r>>v[i].val;
        rasp[i]=v[i].val;
        v[i].ind=i;
    }
    sort(v+1, v+n+1, cmp);
    for(int i=1;i<=n;i++){
        g[v[i].ind]=i;
    }
    int maxim=0, cnt=0;
    for(int i=1;i<=n;i++){
        d[i]=querry(g[i])+1;
        update(g[i], d[i]);
        maxim=max(maxim, d[i]);
    }
    w<<maxim<<"\n";
    for(int i=n;i>=1;i--){
        if(d[i]==maxim){
            g[cnt]=rasp[i];
            cnt++;
            maxim--;
        }
    }
    for(int i=cnt-1;i>=0;i--){
        w<<g[i]<<" ";
    }
    return 0;
}