Cod sursa(job #48450)

Utilizator alecmanAchim Ioan Alexandru alecman Data 4 aprilie 2007 19:48:03
Problema NextSeq Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
/*
 *
 *
  infoarena 2.0 - Arhiva - NextSeq
 *
 *
 */

#include<stdio.h>
#include<math.h>

#define INPUT "nextseq.in"
#define OUTPUT "nextseq.out"

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

long n,m,p,sir[10001],a[10001],b[10001],vec[10001],vec2[10001],pozitie[10001];

void citire();
void quick(long st, long dr);
void seteazavec();
void calcprimu();
void calculdoilea();
void finalizeaza();

int main()
{
  citire();
  quick(1,n);
  seteazavec();
  calcprimu();
  calculdoilea();
  finalizeaza();
  fclose(fin);
  fclose(fout);
  return 0;
}

void citire()
{
  fscanf(fin, "%ld %ld %ld", &n, &m, &p);
  for(long i=1;i<=n;++i)
    fscanf(fin, "%ld", &sir[i]);
  for(long i=1;i<=m;++i)
    fscanf(fin, "%ld", &a[i]);
  for(long i=1;i<=p;++i)
    fscanf(fin, "%ld", &b[i]);
}

void quick(long st, long dr)
{
  long l=st,m=dr;
  while(l!=m)
  {
    if((l<m&&sir[l]>sir[m])||(l>m&&sir[l]<sir[m]))
    {
      sir[l]=sir[l]+sir[m];
      sir[m]=sir[l]-sir[m];
      sir[l]=sir[l]-sir[m];
      l=l+m;
      m=l-m;
      l=l-m;
      if(l<m)
        --m;
      else
        ++m;
    }
    else
      if(l<m)
        --m;
      else
        ++m;
  }
  if(l!=st) quick(st,l-1);
  if(l!=dr) quick(l+1,dr);
}

void seteazavec()
{
  for(long i=1;i<=n;++i)
    pozitie[sir[i]]=i;
}

void calcprimu()
{
  for(long i=m;i>=1;--i)
    vec[i]=pozitie[a[m-i+1]];
}

void calculdoilea()
{
  for(long i=p;i>=1;--i)
    vec2[i]=pozitie[b[p-i+1]];
}

void finalizeaza()
{
  long long numar=0,total=0;
  for(long i=1;i<=n||i<=m||i<=p;++i)
  {
    numar=vec2[i]-vec[i];
    if(numar!=0)
      total=total+numar*pow(n,i-1);
  }
  fprintf(fout, "%lld\n", total-1);
}