Cod sursa(job #222222)

Utilizator gigi_becaliGigi Becali gigi_becali Data 21 noiembrie 2008 12:00:10
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
using namespace std;
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#define oo 0x3f3f3f3f

struct node { int v, p, h; node *left, *right;};

typedef node* treap;

treap R, nil;

inline void init(treap &R)//trebuie apelata la inceput in main
{
	srand(time(0));
	nil=new node;
	nil->left=nil->right=0;
	nil->v=nil->p=-oo;
	nil->h=0;
	R=nil;
}

inline void geth(treap &n)
{
	if(n==nil)return;
	n->h=1;
	if(n->left) n->h += n->left->h;
	if(n->right) n->h += n->right->h;
}

inline void rotleft(treap &n)
{
	treap t=n->left;
	n->left=t->right;
	t->right=n;
	geth(n); geth(t);
	n=t;
}

inline void rotright(treap &n)
{
	treap t=n->right;
	n->right=t->left;
	t->left=n;
	geth(n); geth(t);
	n=t;
}

inline void insert(treap &n, int v){
	if(n == nil){
		n= new node;
		n->v=v;
		n->p=rand();
		n->left=n->right=nil;
		n->h=1;
		return;
	}
		
	if(v < n->v){
		insert(n->left, v);
		if(n->left->p > n->p) rotleft(n);
	}
	
	if(v > n->v){
		insert(n->right, v);
		if(n->right->p > n->p) rotright(n);
	}
	
	geth(n);
}

inline void sterge(treap &n, int v)
{
	if(n == nil) return;
	if(v < n->v) sterge(n->left, v);
	if(v > n->v) sterge(n->right, v);
	if(v == n->v){
		if(n->left->p > n->right->p) rotleft(n);
		else rotright(n);
		
		if(n != nil) sterge(n, v);
		else{
			free(n->left);
			n->left=0;
		}
	}
	geth(n);
}

inline void ino(treap n){
	if(n == nil) return;
	ino(n->left);
	printf("%d ", n->v);
	ino(n->right);
}

inline int findk(treap n, int k){
	if(n == nil) return 0;
	if(n->left->h +1 == k) return n->v;
	if(n->left->h +1 < k) return findk(n->right, k - (n->left->h+1) );
	if(n->left->h + 1> k) return findk(n->left, k);
	return 0;
}


inline int max_height(treap n)
{
	if(n == nil) return 0;
	return max(max_height(n->left), max_height(n->right))+1;
}


int a[1000001];

int main(){
	init(R);
	/*
	insert(R, 12);
	insert(R, 8);
	insert(R, 9);
	insert(R, 4);
	insert(R, 10);
	insert(R, 19);
	
	
	sterge(R, 10);
	sterge(R, 8);
	insert(R, 23);
	insert(R, 12);
	insert(R, 43);\n
	sterge(R, 19);
	
	ino(R);
	printf("\n");
	
	printf("%d %d %d %d %d\n", findk(R,1), findk(R,2), findk(R,3), findk(R, 4), findk(R,5));
	*/
	int n=1000000;
	int i;
	for(i=1;i<=n;++i) a[i]=(rand()*rand())%100000000;
	
	printf("%d %d\n", a[1],a[2]);
	double start=clock();
	
	for(i=1;i<=n;++i) insert(R, a[i]);
//	for(i=1;i<=n;++i) printf("%d ", findk(R, i));
	printf("\n\n");
	//ino(R);
	
	///for(i=1;i<=n;++i) sterge(R, a[i]);
	
//	ino(R);
	
	
	
	printf("\n\n%lf\n", (clock()-start)/(double)CLOCKS_PER_SEC);

	printf("%d\n", max_height(R));
	return 0;
}