Pagini recente »
Cod sursă (job #131075)
|
Cod sursă (job #521947)
|
Istoria paginii runda/testbkt11
|
Rating Anton Matei Boicea (anton_boicea)
|
Cod sursă (job #77280)
Cod sursă (job
#77280)
// 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;
}