Cod sursa(job #1533085)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 22 noiembrie 2015 00:06:12
Problema Stramosi Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct comanda{ int sus, ind; };

void dfs(int *start_stiva, int *stiva, int *nr_copii, int **copii, int *nr_comenzi, struct comanda **comenzi_dupa_nod, int *rez){
	const int cur = *stiva;

	for(int i = 0; i < nr_comenzi[cur]; ++i){
		int *poz_in_stiva = stiva - comenzi_dupa_nod[cur][i].sus;
		rez[comenzi_dupa_nod[cur][i].ind] = (poz_in_stiva < start_stiva) ? 0 : *poz_in_stiva; }

	for(int i = 0; i < nr_copii[cur]; ++i){
		*(stiva+1) = copii[cur][i];

		dfs(start_stiva, stiva+1, nr_copii, copii, nr_comenzi, comenzi_dupa_nod, rez); } }

int main(){
	FILE *f = fopen("stramosi.in", "r"), *g = fopen("stramosi.out", "w");
	int n, m;
	fscanf(f, "%d %d", &n, &m);

	int *tata = malloc((n+1) * sizeof(int)),
		*nr_copii = malloc((n+1) * sizeof(int)),
		**copii = malloc((n+1) * sizeof(int*)),
		*copil_cur = malloc((n+1) * sizeof(int)),
		*nr_comenzi = malloc((n+1) * sizeof(int)),
		*comanda_cur = malloc((n+1) * sizeof(int));
	memset(nr_copii, 0, (n+1) * sizeof(int));
	memset(copil_cur, 0, (n+1) * sizeof(int));
	memset(nr_comenzi, 0, (n+1) * sizeof(int));
	memset(comanda_cur, 0, (n+1) * sizeof(int));
	struct comanda_input { int care, sus; };
	struct comanda_input *comenzi = malloc(m * sizeof(struct comanda_input));
	struct comanda **comenzi_dupa_nod = malloc((n+1) * sizeof(struct comanda*));

	for(int i = 1, t; i <= n; ++i){
		fscanf(f, "%d", &t);
		tata[i] = t;
		++nr_copii[t]; }

	for(int i = 0; i <= n; ++i){
		copii[i] = malloc(nr_copii[i] * sizeof(int)); }

	for(int i = 1; i <= n; ++i){
		copii[tata[i]][copil_cur[tata[i]]++] = i; }
	
	for(int i = 0, p, q; i < m; ++i){
		fscanf(f, "%d %d", &q, &p);
		comenzi[i].care = q;
		comenzi[i].sus = p;
		++nr_comenzi[q]; }

	for(int i = 0; i <= n; ++i){
		comenzi_dupa_nod[i] = malloc(nr_comenzi[i] * sizeof(struct comanda)); }

	for(int i = 0; i < m; ++i){
		const int care = comenzi[i].care;
		comenzi_dupa_nod[care][comanda_cur[care]].sus = comenzi[i].sus;
		comenzi_dupa_nod[care][comanda_cur[care]++].ind = i; }

	int *rez = malloc(m * sizeof(int)), *stiva = malloc((n+1) * sizeof(int));
	stiva[0] = 0;

	dfs(stiva, stiva, nr_copii, copii, nr_comenzi, comenzi_dupa_nod, rez);

	for(int i = 0; i < m; ++i){
		fprintf(g, "%d\n", rez[i]); }

	return 0; }