Cod sursa(job #1360295)

Utilizator HDT_TibiHudema Dumitru Tiberiu HDT_Tibi Data 25 februarie 2015 13:34:57
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;

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

int n,a[100001],b[100001],m,poz1[1000],poz2[1000],v1[1000],v2[1000];
stack<int> lista1,lista2;

int scm(int *a, int k,int *val,int *poz)
{
    int i,lmax=0;
    val[0]=-1;
    for(i=1; i<=k; i++)
    {
        int j=lmax;
        while (val[j]>a[i]) j--;
        val[j+1]=a[i];
        poz[i]=j+1;
        lmax=max(lmax,j+1);
        //fout<<a[i]<<" a fost pus pe "<<j+1<<endl;
    }
    return lmax;
}

void interclasare(int *v1,int *v2,int l1, int l2)
{
    int i,j=1,x1=1,x2=1;
    for(i=1; i<=l1; i++)
    {
        while(v2[j]<v1[i]and j<=l2)
            {
                //fout<<v1[i]<<" "<<v2[j]<<endl;
                for(;x2<=lista2.top();x2++)fout<<b[x2]<<" ";
                lista2.pop();
                j++;
            }

        for(;x1<=lista1.top();x1++)fout<<a[x1]<<" ";
        lista1.pop();
    }
    for(;x1<=n;x1++) fout<<a[x1]<<" ";
    for(;x2<=m;x2++) fout<<b[x2]<<" ";
    fout<<endl;
}

int main()
{
    int i;
    fin>>n;
    for(i=1; i<=n; i++)
        fin>>a[i];

    fin>>m;
    for(i=1; i<=m; i++)
        fin>>b[i];
    int l1=scm(a,n,v1,poz1);
    int l2=scm(b,m,v2,poz2);
    fout<<l1+l2<<endl;
    int k=l1+1;
    for(i=n;i;i--)if(k-1==poz1[i]){lista1.push(i);k--;v1[k]=a[i];}
    k=l2+1;
    for(i=m;i;i--)if(k-1==poz2[i]){lista2.push(i);k--;v2[k]=b[i];}
    //while(!lista1.empty()){fout<<lista1.top()<<" "; lista1.pop();}

   interclasare(v1,v2,l1,l2);
    return 0;
}