Pagini recente »
Borderou de evaluare (job #201437)
|
Cod sursă (job #368956)
|
Monitorul de evaluare
|
Istoria paginii runda/concurs_clasa_a_7-a
|
Cod sursă (job #77617)
Cod sursă (job
#77617)
// 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;
}