Cod sursa(job #2191947)

Utilizator AndreiOffCovaci Andrei-Ion AndreiOff Data 4 aprilie 2018 10:55:06
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define NMAX 10005
using namespace std;

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

int n, m, r[20005], l1, l2;

vector<int> a, b;

bitset<NMAX> viz1, viz2;

void citire(){

f>>n;
for(int i=1; i<=n; i++){

    int x;
    f>>x;
    a.push_back(x);

}

f>>m;

for(int i=1; i<=m; i++){

    int x;
    f>>x;
    b.push_back(x);

}

}

int cmlsc(vector<int> a, int k){

vector<int> b;

int p, u, m;

b.push_back(0);
r[0] = 0;

p = u = m = 0;

for(int i=1; i<a.size(); i++){

    if(a[i] > a[b.back()]){

        r[i] = b.back();
        b.push_back(i);

    }

    p = 0;
    u = b.size() - 1;

    while(p<u){

        m = (p + u)/2;
        if(a[b[m]] < a[i]) p = m + 1;
        else u = m;

    }

    if(a[i] < a[b[u]]){

        b[u] = i;
        if(u > 0) r[i] = b[u - 1];

    }



}

if(k){

for(u = b.size(), p = b.back(); u--; p = r[p]) viz2[p] = 1;

}else{

for(u = b.size(), p = b.back(); u--; p = r[p]) viz1[p] = 1;

}

return b.size();

}

void interclasare(){

for(int i = 0, j = 0; i<n || j<m;){

    if(i>=n || (j<m && viz2[j] == 0) ){

        g<<b[j]<<" ";
        j++;

    }else if( j>=m || (i<n && viz1[i] == 0) ){

        g<<a[i]<<" ";
        i++;

    }else if(a[i] < b[j]){

        g<<a[i]<<" ";
        i++;

    }else{

    g<<b[j]<<" ";
    j++;

    }

}

}

int main()
{

citire();
l1 = cmlsc(a, 0);
l2 = cmlsc(b, 1);
g<<l1 + l2<<"\n";
interclasare();

    return 0;
}