/* 論理回路シミュレータ */

#include<stdio.h>
#include<stdlib.h>

#define MAX 20/* 回路数の上限 */

int num;/* 回路の個数 */

/* 回路構造体 */
struct{
	int x,y,z;/* 入力、入力、出力 */
	int type;/* 回路のタイプ(AND=1,OR=2,NOT=3,NAND=4,NOR=5,XOR=6) */
	int next;/* 出力先の回路番号 */
	int xflag,yflag;/* 入力は手動か(yes=1,no=0) */
}kairo[MAX];

/* 初期化 */
void init(){
	int i;
	for(i=0;i<MAX;i++){
		kairo[i].xflag = kairo[i].yflag = 0;
	}
}

/* 入力 */
void input(){
	int i;
	char str[10];
	printf("回路の数-->"); num = atoi(gets(str));
	for(i=0;i<num;i++){
		printf("kairo[%d].type(AND=1,OR=2,NOT=3,NAND=4,NOR=5,XOR=6)-->",i);
		kairo[i].type = atoi(gets(str));
		printf("出力先回路NO(最後の場合は-1)-->"); kairo[i].next = atoi(gets(str));
		if(kairo[kairo[i].next].xflag == 0){
			kairo[kairo[i].next].xflag = 1;
		}else{
			kairo[kairo[i].next].yflag = 1;
		}			
		
		if(kairo[i].type == 3){
			if(kairo[i].xflag == 0){
				printf("kairo[%d].x-->",i);	kairo[i].x = atoi(gets(str));
			}
		}else{
			if(kairo[i].xflag == 0){
				printf("kairo[%d].x-->",i);	kairo[i].x = atoi(gets(str));
			}
			if(kairo[i].yflag == 0){
				printf("kairo[%d].y-->",i);	kairo[i].y = atoi(gets(str));
			}
		}
	}
}

/* 処理 */
void syori(){
	int i;
	for(i=0;i<num;i++){
		switch(kairo[i].type){
			case 1:kairo[i].z = kairo[i].x && kairo[i].y;break;/* AND */
			case 2:kairo[i].z = kairo[i].x || kairo[i].y;break;/* OR */
			case 3:kairo[i].z = !kairo[i].x;break;/* NOT */
			case 4:kairo[i].z = !(kairo[i].x && kairo[i].y);break;/* NAND */
			case 5:kairo[i].z = !(kairo[i].x || kairo[i].y);break;/* NOR */
			case 6:kairo[i].z = (kairo[i].x && !kairo[i].y) || (!kairo[i].x && kairo[i].y);break;/* XOR */
		}
		if(kairo[kairo[i].next].xflag == 1){kairo[kairo[i].next].x = kairo[i].z;}
		if(kairo[kairo[i].next].yflag == 1){kairo[kairo[i].next].y = kairo[i].z;}
		printf("kairo[%d].z = %d\n",i,kairo[i].z);
	}
}

/* 結果 */
void result(){
	int i;
	for(i=0;i<num;i++){
		if(kairo[i].next == -1){
			printf("出力=%d\n",kairo[i].z);
			break;
		}
	}
}	

/* メイン関数 */
int main(){
	init();/* 初期化 */
	input();/* 入力 */
	syori();/* 処理 */
	result();/* 結果 */
	return 0;
}

