Pagini recente » Borderou de evaluare (job #1009937) | Borderou de evaluare (job #1767303) | Borderou de evaluare (job #580140) | Borderou de evaluare (job #858911) | Cod sursa (job #2761002)
#include <fstream>
using namespace std;
ifstream fin("curatenie.in");
ofstream fout("curatenie.out");
//aflam postord din io si pro
struct nod { int left, right; };
int N;
int RSD[500005], SRD[500005], SDR[500005];
nod Arbore[500005];
void Citire()
{
int x;
fin >> N;
for (int i = 1; i <= N; ++i) //in ordine
{
fin >> x; SRD[i] = x;
SDR[x] = i;
}
for (int i = 1; i <= N; ++i) fin >> RSD[i]; //pre ordine
}
//stanga, dreapta si pozitia radacinii in pre-ord
void Rezolvare(int l, int r, int pr)
{
int radl, radr, rad;
rad = RSD[pr];
//am ceva la stanga
if (SDR[rad] > l) Arbore[rad].left = RSD[pr + 1];
else Arbore[rad].left = 0;
//am ceva la dreapta
if (SDR[rad] < r) Arbore[rad].right = RSD[pr + SDR[rad] - l + 1];
else Arbore[rad].right = 0;
if (Arbore[rad].left) Rezolvare(l, SDR[rad] - 1, pr + 1);
if (Arbore[rad].right) Rezolvare(SDR[rad] + 1, r, pr + SDR[rad] - l + 1);
}
void Afisare()
{
for (int i = 1; i <= N; ++i)
fout << Arbore[i].left << " " << Arbore[i].right << "\n";
}
int main()
{
Citire();
//in preordine radacina e pe primul poz
Rezolvare(1, N, 1);
Afisare();
return 0;
}