Cod sursă (job #76648)

Utilizator avatar BonCip Bonciocat Ciprian Mircea BonCip IP ascuns
Problemă Pointeri Compilator c | 1,40 kb
Rundă Tema 2 clasele 9-10 2014/15 Status evaluat
Dată 2 oct. 2014 20:41:29 Scor 40
#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 ], ans[ N_MAX ];
int srt[ N_MAX ], pos;

void sort( node* start ) { // Sortam
	if( start != NULL ) {
		sort( start -> st );
		srt[ pos ++ ] = start - v;
		sort( start -> dr );
	}
}

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 ++ ) { // Cream vectorul de raspuns
		ans[ srt[ i ] ].st = ( i == 0 ? NULL : ans + srt[ i - 1 ] );
		ans[ srt[ i ] ].dr = ( i == N - 1 ? NULL : ans + srt[ i + 1 ] );
	}

	// Afisare
	fprintf( fout, "%d\n", srt[ 0 ] );
	for( i = 0; i < N; i ++ ) {
		fprintf( fout, "%d ", ans[ i ].st == NULL ? -1 : ans[ i ].st - ans );
	}
	fprintf( fout, "\n" );
	for( i = 0; i < N; i ++ ) {
		fprintf( fout, "%d ", ans[ i ].dr == NULL ? -1 : ans[ i ].dr - ans );
	}

	fclose( fin );
	fclose( fout );
}