Pagini recente » Cod sursa (job #1433977) | Cod sursa (job #686674) | Cod sursa (job #241667) | Cod sursa (job #2069361) | Cod sursa (job #1360295)
#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;
}