Cod sursa(job #57522)

Utilizator peanutzAndrei Homorodean peanutz Data 2 mai 2007 15:01:29
Problema NextSeq Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 10100

int n, m, p;
int x[NMAX], a[NMAX], b[NMAX];

void read(int a[NMAX], int n)
{
	int i;

	for(n; n> 0; --n)
	{
		scanf("%d ", &a[n]);
	}
}

void sort()
{
	int i, j, ok, aux;

	do
	{
		ok = 0;

		for(i = 0; i < n; ++i)
		{
			if(x[i] > x[i+1])
			{
				aux = x[i];
				x[i] = x[i+1];
				x[i+1] = aux;
				ok = 1;
			}
		}

	}	while(ok);
}

void normalizeaza(int a[NMAX], int y)
{
	int i;
	int st, dr, m;

	for(i = 1; i <= y; ++i)
	{
		st = 1;
		dr = n;
		while(st <= dr)
		{
			m = (st + dr)/2;

			if(x[m] == a[i])
			{
				a[i] = m-1;
				break;
			}
			else if(x[m] > a[i])
			{
				dr = m-1;
			}
			else
			{
				st = m+1;
			}
		}
	}
}

void scadere(int a[NMAX], int b[NMAX])
{
	int i, t;
	long x = 0, pow = 1;

	for(i = 1, t = 0; i <= m; ++i)
	{
		a[i] += (t = (a[i] -= b[i] + t) < 0) * n;
	}

	for(; m > 1 && !a[m]; --m);

	for(i = 1; i <= m; ++i)
	{
	  x += a[i] * pow;
	  pow *= n;
	}
	printf("%ld\n", x);
}
int main()
{
	freopen("nextseq.in", "r", stdin);
	freopen("nextseq.out",  "w", stdout);

	scanf("%d %d %d\n", &n, &m, &p);

	read(x, n);
	read(a, m);
	read(b, p);

	sort();

	normalizeaza(a, m);
	normalizeaza(b, p);

	/*int i, aux[NMAX];

	memset(aux,  0, sizeof(aux));
	for(i = p; i > 0; --i)
		aux[i] = b[p-i+1];
	memcpy(b, aux, sizeof(aux));
	*/
	++a[1];
	scadere(b, a);

	fclose(stdin);
	fclose(stdout);

	return 0;
}