Pagini recente » Cod sursa (job #1968592) | Cod sursa (job #2760847) | Cod sursa (job #1308245) | Cod sursa (job #1760847) | Cod sursa (job #2875999)
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
mt19937 rng(time(NULL));
struct Treap
{
int mind,valmax,valmin,data,lg,pri;
Treap* kids[2];
Treap(int val)
{
data=val;
lg=1;
pri=rng();
valmax=data;
valmin=data;
mind=2e9;
kids[0]=NULL;
kids[1]=NULL;
}
};
Treap* t=NULL;
int size(Treap* me)
{
if(me==NULL)
return 0;
return me->lg;
}
void recalc(Treap* me)
{
if(me==NULL)
return;
me->lg=size(me->kids[0])+size(me->kids[1])+1;
me->valmax=me->data;
me->valmin=me->data;
me->mind=2e9;
if(me->kids[0]!=NULL)
{
me->valmax=max(me->valmax,me->kids[0]->valmax);
me->valmin=min(me->valmin,me->kids[0]->valmin);
me->mind=min(me->mind,me->kids[0]->mind);
me->mind=min(me->mind,abs(me->data-me->kids[0]->valmax));
me->mind=min(me->mind,abs(me->data-me->kids[0]->valmin));
}
if(me->kids[1]!=NULL)
{
me->valmax=max(me->valmax,me->kids[1]->valmax);
me->valmin=min(me->valmin,me->kids[1]->valmin);
me->mind=min(me->mind,me->kids[1]->mind);
me->mind=min(me->mind,abs(me->data-me->kids[1]->valmax));
me->mind=min(me->mind,abs(me->data-me->kids[1]->valmin));
}
}
array<Treap*,2> split(Treap* me,int key)
{
if(me==NULL)
return {NULL,NULL};
if(me->data<key)
{
array<Treap*,2> a=split(me->kids[1],key);
Treap* l=me;
l->kids[1]=a[0];
Treap* r=a[1];
recalc(l);
recalc(r);
return {l,r};
}
else
{
array<Treap*,2> a=split(me->kids[0],key);
Treap* l=a[0];
Treap* r=me;
r->kids[0]=a[1];
recalc(l);
recalc(r);
return {l,r};
}
}
Treap* merge(Treap* a, Treap* b)
{
if(a==NULL)
return b;
if(b==NULL)
return a;
if(a->pri>b->pri)
{
Treap* rez=a;
rez->kids[1]=merge(a->kids[1],b);
recalc(rez);
return rez;
}
else
{
Treap* rez=b;
rez->kids[0]=merge(a,b->kids[0]);
recalc(rez);
return rez;
}
}
Treap* putout(Treap* me,int val)
{
if(me==NULL)
return me;
if(me->data==val)
{
Treap* rez=merge(me->kids[0],me->kids[1]);
delete me;
return rez;
}
if(me->data<val)
{
me->kids[1]=putout(me->kids[1],val);
recalc(me);
return me;
}
if(me->data>val)
{
me->kids[0]=putout(me->kids[0],val);
recalc(me);
return me;
}
}
Treap* putin(Treap* me,Treap* nod)
{
if(me==NULL)
return nod;
if(me->data<nod->data)
{
if(nod->pri<me->pri)
{
me->kids[1]=putin(me->kids[1],nod);
recalc(me);
return me;
}
else
{
nod->kids[0]=me;
recalc(nod);
return nod;
}
}
if(me->data>nod->data)
{
if(nod->pri<me->pri)
{
me->kids[0]=putin(me->kids[0],nod);
recalc(me);
return me;
}
else
{
nod->kids[1]=me;
recalc(nod);
return nod;
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
string tip;
while(fin>>tip)
{
if(tip=="I")
{
int x;
fin>>x;
t=putout(t,x);
Treap* nod=new Treap(x);
t=putin(t,nod);
continue;
}
if(tip=="S")
{
int x;
fin>>x;
int prvlg=size(t);
t=putout(t,x);
if(size(t)==prvlg)
fout<<-1<<'\n';
continue;
}
if(tip=="C")
{
int x;
fin>>x;
int prvlg=size(t);
t=putout(t,x);
if(size(t)!=prvlg)
{
fout<<1<<'\n';
Treap* nod=new Treap(x);
t=putin(t,nod);
}
else
fout<<0<<'\n';
continue;
}
if(tip=="MAX")
{
if(size(t)<2)
fout<<-1<<'\n';
else
fout<<t->valmax-t->valmin<<'\n';
continue;
}
if(tip=="MIN")
{
if(size(t)<2)
fout<<-1<<'\n';
else
fout<<t->mind<<'\n';
continue;
}
}
return 0;
}