Cod sursă (job #77280)

Utilizator avatar BonCip Bonciocat Ciprian Mircea BonCip IP ascuns
Problemă Pointeri Compilator c | 1,65 kb
Rundă Tema 2 clasele 9-10 2014/15 Status evaluat
Dată 6 oct. 2014 10:46:52 Scor 38
// Solutia e un pic cam ciocanita, in sensul ca rescriu peste vectorul v pentru a economisi memorie
#include <stdio.h>
#include <stdlib.h>

#define N_MAX 200000
FILE * fin, * fout;

typedef struct _node {
	struct _node *st, *dr;
} node;

node v[ N_MAX ];
int pos;

void sort( node* start ) { // Sortam
	if( start != NULL ) {
		sort( start -> st ); // Bucata din stanga
		start -> st = v + pos; // Refolosim st-ul pentru a scrie locul lui start in vectorul sortat (un fel de normalizare)
		pos ++;
		sort( start -> dr ); // Bucata din dreapta
	}
}

int main( ) {
	fin = fopen( "pointeri.in", "r" );
	fout = fopen( "pointeri.out", "w" );

	// Citire
	int N, rad;
	fscanf( fin, "%d%d", &N, &rad );

	// Alocam pointerii
	int i;
	for( i = 0; i < N; i ++ ) {
		v[ i ].dr = (node*)malloc(sizeof(node));
		v[ i ].st = (node*)malloc(sizeof(node));
	}

	for( i = 0; i < N; i ++ ) { // Citire st
		int tmp;
		fscanf( fin, "%d", &tmp );
		v[ i ].st = ( tmp == -1 ? NULL : v + tmp );
	}
	for( i = 0; i < N; i ++ ) { // Citire dr
		int tmp;
		fscanf( fin, "%d", &tmp );
		v[ i ].dr = ( tmp == -1 ? NULL : v + tmp );
	}

	// Sortarea
	sort( v + rad );

	for( i = 0; i < N; i ++ ) {
		v[ v[ i ].st - v ].dr = v + i; // Refolosim dr-ul pentru a rescrie vectorul sortat
	}

	// Afisare (punem %ld pentru a potoli compilatorul)
	fprintf( fout, "%ld\n", v[ 0 ].dr - v ); // Primul
	for( i = 0; i < N; i ++ ) { // Stanga
		fprintf( fout, "%ld ", v[ i ].st - v == 0 ? -1 : v[ v[ i ].st - v - 1 ].dr - v );
	}
	fprintf( fout, "\n" );
	for( i = 0; i < N; i ++ ) { // Dreapta
		fprintf( fout, "%ld ", v[ i ].st - v == N - 1 ? -1 : v[ v[ i ].st - v + 1 ].dr - v );
	}

	fclose( fin );
	fclose( fout );
	return 0;
}