Cod sursa(job #1533086)

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

#define MAXN 250000
#define MAXM 300000

struct comanda{ int sus, ind; };

void dfs(int *start_stiva, int *stiva, int nr_copii[MAXN+1], int *copii[MAXN+1], int nr_comenzi[MAXN+1],
	struct comanda *comenzi_dupa_nod[MAXN+1], int rez[MAXM]){
	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[MAXN+1], nr_copii[MAXN+1], *copii[MAXN+1], copil_cur[MAXN+1], nr_comenzi[MAXN+1], comanda_cur[MAXN+1];
	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[MAXM];
	struct comanda *comenzi_dupa_nod[MAXN+1];

	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[MAXM], stiva[MAXN+1];
	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]); }

	for(int i = 0; i <= n; ++i){
		free(copii[i]); }

	for(int i = 0; i <= n; ++i){
		free(comenzi_dupa_nod[i]); }
	return 0; }