Cod sursa(job #1540079)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 2 decembrie 2015 01:02:46
Problema Hashuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("hashuri.in");
ofstream fout("hashuri.out");

struct Nod{

	int key; 

	Nod* st;
	Nod* dr;

	Nod(Nod* st, Nod* dr, int key) {

		this->st = st;
		this->dr = dr;
		this->key = key;

	}

};

Nod* nil;

Nod* adauga(Nod* n, const int key) {

	if(n == nil) {

		n = new Nod(nil, nil, key);
		return n;
	}

	if(n->key > key)
		n->st = adauga(n->st, key);
	else 
		n->dr = adauga(n->dr, key);

	return n;

}

Nod* sterge(Nod* n, const int key) {

	if(n == nil)
		return n;

	if(n->key == key) {

		if(n->st == nil || n->dr == nil) {

			Nod* ret = (n->st == nil) ? n->dr : n->st;

			delete n;
			return ret; 

		} else {

			Nod* ret = n->dr;

			for( ; ret->st != nil ; ret = ret->st ) ;

			n->key = ret->key;
			n->dr = sterge(n->dr, ret->key);

			return n;
		}

	}

	if(n->key > key)
		n->st = sterge(n->st, key);
	else 
		n->dr = sterge(n->dr, key);

	return n;
}

int interogare(Nod* n, const int key) {

	if(n == nil)
		return 0;
	if(n->key == key)
		return 1;
	
	if(n->key > key)
		return interogare(n->st, key);
	else 
		return interogare(n->dr, key);
	//return 0;
}

int main() {

	nil = new Nod(NULL, NULL, 0);
	Nod* root = nil;	

	int type; int x;int N;

	fin >> N;


	while(N--) {

		fin >> type >> x;

		switch(type) {

			case 1: root = adauga(root, x); break;
			case 2: root = sterge(root, x); break;
			case 3: fout << interogare(root, x) << '\n'; break;
		}
	}

	return 0;
}