Cod sursa(job #1806665)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 15 noiembrie 2016 16:46:40
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <bits/stdc++.h>
#define INF 1000000009
using namespace std;

struct tr
{
	int min, max, md, k, p;
	tr * l, *r;

	tr(int _k)
	{
		p = rand();
		l = r = NULL;
		min = max = k = _k;
		md = INF;
	}
} *t;

string s;
int n, x;

void upd(tr * t)
{
	if(!t) return;
	t->md = INF;
	t->min = t->max = t->k;
	if(t->l)
		t->min = min(t->min, t->l->min),
		t->max = max(t->max, t->l->max),
		t->md = min(t->md, min(t->l->md, t->k - t->l->max ) );
	if(t->r)
		t->min = min(t->min, t->r->min),
		t->max = max(t->max, t->r->max),
		t->md = min(t->md, min(t->r->md, t->r->min - t->k) );
}

void split(tr * rt, int k, tr* &l, tr* &r)
{
	if(rt == NULL)
		l = r = NULL;
  else if(k < rt->k)
	{
		split(rt->l, k, l, rt->l);
		r = rt;
	}
	else
	{
		split(rt->r, k, rt->r, r);
		l = rt;
	}
	upd(rt);

}

void merge(tr* &rt, tr* l, tr* r)
{
	if(!l || !r)
		rt = l ? l : r;
	else if(l->p > r->p)
	{
		merge(l->r, l->r, r);
		rt = l;
	}
	else
	{
		merge(r->l, l, r->l);
		rt = r;
	}
	upd(rt);
}

int Min(tr* t)
{
	if(t)
		return t->md;
	else return -1;
}

int Max(tr* t)
{
	if(t && (t->l || t->r))
		return t->max - t->min;
	else return -1;
}

void add(tr * &p, int nr)
{
	tr * t, *ls, *rs;
	t = new tr(nr);

	split(p, nr, ls, rs);
	merge(ls, ls, t);
	merge(p, ls, rs);
}

int sch(tr* &p, int nr)
{
	int ok = 1;
	tr * t, *ls, *rs;
	split(p, nr, ls, rs);
	split(ls, nr-1, ls, t);
	
	if(!t) ok = 0;

	merge(ls, ls, t);
	merge(p, ls, rs);	
	return ok;
}

void del(tr* &p, int nr)
{
	tr * t, *ls, *rs;
	split(p, nr, ls, rs);
	split(ls, nr-1, ls, t);
	if(t) delete(t);
	merge(p, ls, rs);	
}


int main()
{

	ios_base :: sync_with_stdio(false);
	freopen("zeap.in", "r", stdin);
	freopen("zeap.out", "w", stdout);
	cin>>s;

	while(!cin.eof())
	{

		if(s == "I")
		{
			cin >> x;
			add(t, x);
		}
		if(s == "MAX") cout << Max(t) << '\n';
		if(s == "MIN") {
		  int pp = Min(t);
        if(pp == INF) pp = -1;
        cout << pp << '\n';
		}
		if( s == "C")
		{
			cin >> x;
			int op = sch(t, x);
			//if(op==0) 
				cout << op << '\n';
		}
		if( s == "S")
		{
			cin >> x;
			int op = sch(t, x);
			if(op==0) 
				cout << -1 << '\n';
			else del(t, x);
		}

		cin>>s;
	}
}