Cod sursa(job #58074)

Utilizator peanutzAndrei Homorodean peanutz Data 3 mai 2007 23:20:06
Problema NextSeq Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 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]);
	}
}

int divide(int p, int q)
{
	int st = p, dr = q;
	int m = x[st];

	while(st < dr)
	{
		while(st < dr && m <= x[dr]) --dr;
		x[st] = x[dr];

		while(st < dr && m >= x[st]) ++st;
		x[dr] = x[st];
	}

	x[st] = m;

	return st;
}


void qsort(int p, int q)
{
	int m = divide(p, q);

	if(m > p)
		qsort(p, m-1);
	if(m < q)
		qsort(m+1, q);
}

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);

	/*
	int i, ok = 1;
	if(p == m)
		for(i = 1; i <= n && ok; ++i)
			if(a[i] != b[i])
				ok = 0;
	else ok = 0;
	if(ok)
	{
		printf("0\n");
		return 0;
	}
	*/


	qsort(1, n);

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

	/*if(m == 1 && a[1] == 0)
	{
		int pow = 1, i;
		long xi= 0;

			for(i = 1; i <= m; ++i)
			{
			xi += b[i] * pow;
			pow *= n;
			}
			printf("%ld\n", xi);
		return 0;
	} */


	/*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[p];
	scadere(b, a);

	fclose(stdin);
	fclose(stdout);

	return 0;
}