Pagini recente » Cod sursa (job #802338) | Cod sursa (job #611516) | Cod sursa (job #1128035) | Cod sursa (job #837062) | Cod sursa (job #2225737)
#include<fstream>
#include<deque>
#include<ctime>
#include<cctype>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<unordered_map>
#define DN 100005
#define x first
#define y second
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
long long f,p,vf;
char c;
struct treap
{
long long ma=0,mi=2e9,r1=0,r2=2e9,pr,val;
treap *st=0,*dr=0;
treap()
{
}
treap(long long value,long long pri,treap *a,treap *b)
{
this->st=a;
this->dr=b;
this->pr=pri;
this->val=value;
}
}*r,*nil;
void compute(treap *&nod)
{
nod->ma=max(nod->val,max(nod->st->ma,nod->dr->ma));
nod->mi=min(nod->val,min(nod->st->mi,nod->dr->mi));
nod->r1=max(nod->st->r1,nod->dr->r1);
nod->r2=min(nod->st->r2,nod->dr->r2);
if(nod->st!=nil&&nod->dr!=nil)
{
nod->r1=max(nod->r1,abs((nod->st->mi)-(nod->dr->ma)));
nod->r2=min(nod->r2,abs((nod->st->ma)-(nod->dr->mi)));
}
}
void rot1(treap *&nod)
{
treap *t=nod->st;
nod->st=t->dr;
t->dr=nod;
nod=t;
}
void rot2(treap *&nod)
{
treap *t=nod->dr;
nod->dr=t->st;
t->st=nod;
nod=t;
}
void balance(treap *&nod)
{
if(nod->st->pr>nod->pr)
rot1(nod);
if(nod->dr->pr>nod->pr);
rot2(nod);
if(nod->st!=nil)
compute(nod->st);
if(nod->dr!=nil)
compute(nod->dr);
}
void ins(treap *&nod)
{
if(nod==nil)
{
nod=new treap(f,p,nil,nil);
nod->ma=nod->mi=f;
nod->r1=0;
nod->r2=2e9;
return;
}
if(nod->val==f)
return;
if(f<nod->val)
ins(nod->st);
else
if(f>nod->val)
ins(nod->dr);
balance(nod);
compute(nod);
}
void del(treap *&nod)
{
if(nod==nil)
return;
treap *act=nod;
if(f<nod->val)
del(nod->st);
if(f>nod->val)
del(nod->dr);
if(nod->val==f)
{
vf=1;
if(nod->st==nil&&nod->dr==nil)
{
delete nod;
nod=nil;
return;
}
if(nod->st->pr>nod->dr->pr)
{
act=nod->st;
rot1(nod);
}
else
{
act=nod->dr;
rot2(nod);
}
del(nod);
}
if(act->st!=nil)
compute(act->st);
if(act->dr!=nil)
compute(act->dr);
compute(act);
}
int cauta(treap *&nod)
{
if(nod==nil)
return 0;
if(nod->val==f)
return 1;
if(f<nod->val)
return cauta(nod->st);
return cauta(nod->dr);
}
char sir[45];
int main()
{
r=nil=new treap(0,0,NULL,NULL);// srand(time(0))<<'\n';
while(fin.getline(sir,45))
{
if(sir[0]=='I')
{
f=0;
for(int i=1;i<strlen(sir);i++)
if(isdigit(sir[i]))
f=f*10+sir[i]-'0';
// cout<<f<<'\n';
p=rand()%((int)1e9)+1;
ins(r);
continue;
}
/* if(sir[0]=='S')
{
vf=0;
f=0;
for(int i=1;i<strlen(sir);i++)
if(isdigit(sir[i]))
f=f*10+sir[i]-'0';
// del(r);
if(!vf)
fout<<-1<<'\n';
continue;
}
/* if(sir[0]=='C')
{
f=0;
for(int i=1;i<strlen(sir);i++)
if(isdigit(sir[i]))
f=f*10+sir[i]-'0';
fout<<cauta(r)<<'\n';
continue;
}
if(sir[2]=='X')
{
if(r->r1==0)
fout<<-1<<'\n';
else
fout<<r->r1<<'\n';
}
else
{
if(r->r2==2e9)
fout<<-1<<'\n';
else
fout<<r->r2<<'\n';
}*/
}
}