Cod sursă (job #77617)

Utilizator avatar BonCip Bonciocat Ciprian Mircea BonCip IP ascuns
Problemă Pointeri Compilator c | 1,45 kb
Rundă Tema 2 clasele 9-10 2014/15 Status evaluat
Dată 7 oct. 2014 21:31:32 Scor 90
// UPDATE: vectori in loc de pointeri
// 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 {
	int st, dr;
} node;

node v[ N_MAX ];
int pos;

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

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

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

	for( i = 0; i < N; i ++ ) { // Citire st
		fscanf( fin, "%d", &( v[ i ].st ) );
	}
	for( i = 0; i < N; i ++ ) { // Citire dr
		fscanf( fin, "%d", &( v[ i ].dr ) );
	}

	// Sortarea
	sort( rad );

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

	// Compilatorul meu local cere %ld in loc de %d, dar se pare ca cel de pe varena.ro cere exact invers :)
	fprintf( fout, "%d\n", v[ 0 ].dr ); // Primul
	for( i = 0; i < N; i ++ ) { // Stanga
		fprintf( fout, "%d ", v[ i ].st == 0 ? -1 : v[ v[ i ].st - 1 ].dr );
	}
	fprintf( fout, "\n" );
	for( i = 0; i < N; i ++ ) { // Dreapta
		fprintf( fout, "%d ", v[ i ].st == N - 1 ? -1 : v[ v[ i ].st + 1 ].dr );
	}

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