Cod sursa(job #1325187)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 23 ianuarie 2015 14:53:31
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
using namespace std;template<typename T>class A{private:struct N{T v;int h;N*l,*r;N(N*n,int H){v=0;h=H;l=r=n;}};N*R,*D;N*i(N*n,T&v){if(n==D){n=new N(D,0);n->v=v;return n;}if(v<n->v)n->l=i(n->l,v);else if(v>n->v)n->r=i(n->r,v);return b(n);}int w(N *n,T &v){if(n==D)return 0;else if(v==n->v)return true;else if(v<n->v)return w(n->l,v);else return w(n->r,v);}N *e(N *n,T &v){if(n==D)return D;if(n->v==v){if(n->l==D||n->r==D){N *p=(n->l==D?n->r:n->l);delete n;return p;}else{N *p;p=n->l;while(p->r!=D)p=p->r;n->v=p->v;n->l=e(n->l,p->v);}}else if(v<n->v)n->l=e(n->l,v);else n->r=e(n->r,v);return b(n);}void z(N *n){n->h=1+max(n->l->h,n->r->h);}N *x(N *n){N *p=n->r;n->r=p->l;p->l=n;z(n);z(p);return p;}N *y(N *n){N *p=n->l;n->l=p->r;p->r=n;z(n);z(p);return p;}N *b(N *n){z(n);if(n->l->h + 1 < n->r->h){if(n->r->l->h>n->r->r->h)n->r=y(n->r);n=x(n);}else if(n->r->h+1<n->l->h){if(n->l->r->h>n->l->l->h)n->l=x(n->l);n=y(n);}return n;}public:A(){D=new N(D,-1);R=D;}void i(T &v) {R=i(R,v);}int w(T &v) {return w(R,v);}void e(T &v) {R=e(R,v);}};int main() {int q,x,T;A<int>V;ifstream I("hashuri.in");ofstream O("hashuri.out");I >> T;while(T--){I>>q>>x;switch(q){case 1:V.i(x);break;case 2:V.e(x);break;case 3:O<<V.w(x)<< '\n';}}return 0;}