Cod sursa(job #1697822)

Utilizator BarbumateiBarbu Matei Barbumatei Data 2 mai 2016 23:10:25
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>
short int v[10000], u[10000], p[10000], q[10000], a[20000], i, j, l, l1, l2, lmax, mij, st, dr;
short int f[2][10000];
FILE *fin, *fout;

void scmax(short int x){
  st=1, dr=l;
  while(st<=dr){
    mij=(st+dr)/2;
    if(x<q[mij]) dr=mij-1;
    else st=mij+1;
  }
  l+=(st>l);
  q[st]=x;
  p[i]=st;
}

int main(){
  short int n, m;
  fin=fopen("interclasare.in", "r");
  fout=fopen("interclasare.out", "w");
  fscanf(fin, "%hi", &n);
  for(i=1; i<=n; i++){
    fscanf(fin, "%hi", &v[i]);
    scmax(v[i]);
  }
  lmax+=l; l1=l; l=0; j=n;
  for(i=lmax; i; i--){
    while(p[j]!=i && j) j--;
    a[i]=v[j];
    f[0][i]=j;
  }
  fscanf(fin, "%hi", &m);
  for(i=1; i<=m; i++){
    fscanf(fin, "%hi", &u[i]);
    scmax(u[i]);
  }
  lmax+=l; l2=l; j=m;
  for(i=l2; i; i--){
    while(p[j]!=i) j--;
    q[i]=u[j];
    f[1][i]=j;
  }
  fprintf(fout, "%hi\n", lmax);
  i=j=st=dr=1; mij=0;
  while(i<=l1 && j<=l2){
    if(a[i]<=q[j]){
      for(; st<=f[0][i]; st++)
        fprintf(fout, "%hi ", v[st]);
      i++;
    }
    else{
      for(; dr<=f[1][j]; dr++)
        fprintf(fout, "%hi ", u[dr]);
      j++;
    }
  }
  while(st<=n)
    fprintf(fout, "%hi ", v[st++]);
  while(dr<=m)
    fprintf(fout, "%hi ", u[dr++]);
  fclose(fin);
  fclose(fout);
    return 0;
}