Cod sursa(job #2902002)

Utilizator MihaiZ777MihaiZ MihaiZ777 Data 15 mai 2022 02:06:49
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

struct inp {
    int val;
    int idx;
};

struct num {
    int val;
    int raw;
};

bool cmp(const inp& a, const inp& b) {
    return a.val < b.val;
}

inp input[100005];
num v[100005];
int aib[100005];
int parent[100005];
int n;

vector <int> ans;

void Update(int pos, int val) {
    for (; pos <= n; pos += pos & (-pos)) {
        if (val > aib[pos]) {
            aib[pos] = val;
        } 
    }
}

int Query(int pos) {
    int max = 0;
    int index = -1;
    for (; pos > 0; pos -= pos & (-pos)) {
        if (v[pos].val > max) {
            max = v[pos].val;
            index = pos;
        }
    }
    return index;
}


int main() {
    fin >> n;
    for (int i = 0; i < n; i++) {
        inp newInp;
        fin >> newInp.val;
        newInp.idx = i + 1;
        input[i] = newInp;
    }
    sort(input, input + n, cmp);

    int currVal = 0;
    int lastVal = -1;
    for (int i = 0; i < n; i++) {
        if (lastVal != input[i].val) {
            currVal++;
            lastVal = input[i].val;
        }
        v[input[i].idx].val = currVal;
        v[input[i].idx].raw = input[i].val;
    }



    // for (int i = 1; i <= n; i++) {
    //     cout << v[i].val << ' ';
    // }
    
    // cout << '\n';
    Update(1, 1);
    parent[1] = 1;
    for (int i = 2; i <= n; i++) {
        int oldIndex = Query(i - 1);
        // cout << v[oldIndex].val << ' '<< v[i].val << '\n';
        if (v[oldIndex].val < v[i].val) {
            Update(i, aib[oldIndex] + 1);
            parent[i] = oldIndex;
        }
        else if (v[oldIndex].val == v[i].val){
            parent[i] = parent[oldIndex];
        }
        else {
            parent[i] = i;
        }
    }

    // for (int i = 1; i <= n; i++) {
    //     cout << parent[i] << ' ';
    // }
    // cout << '\n';
    // for (int i = 1; i <= n; i++) {
    //     cout << aib[i] << ' ';
    // }
    

    int ansIdx = Query(n);
    // cout << '\n';
    // cout << ansIdx << ' ';
    fout << aib[ansIdx] << '\n';
    while (parent[ansIdx] != ansIdx) {
        ans.push_back(v[ansIdx].raw);
        ansIdx = parent[ansIdx];
    }
    ans.push_back(v[ansIdx].raw);

    for (int i = ans.size() - 1; i >= 0; i--) {
        fout << ans[i] << ' ';
    }
}