Cod sursa(job #2876069)

Utilizator Savu_Stefan_CatalinSavu Stefan Catalin Savu_Stefan_Catalin Data 22 martie 2022 21:59:41
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <fstream>
#include <random>
#include <ctime>
using namespace std;
ifstream in("zeap.in");
ofstream out("zeap.out");
struct nya{
nya *st,*dr;
int val,prior,sz,ma,mi,dmi;};
nya nil;
nya *tr=&nil;
int mmin(int a,int b)
{
    if (a==0) return b;
    if (b==0) return a;
    if (a<b) return a;
    return b;
}
int mmax(int a,int b)
{
    if (a>b) return a;
    return b;
}
nya* trr(nya *n,nya *f,int c)
{
    if (c==0) n->st=f;
    else n->dr=f;
    n->sz=1+n->st->sz+n->dr->sz;
    if (n->st!=&nil) n->mi=n->st->mi;
    else n->mi=n->val;
    if (n->dr!=&nil) n->ma=n->dr->ma;
    else n->ma=n->val;
    n->dmi=1000000000;
    if (n->st!=&nil) n->dmi=mmin(n->st->dmi,n->val-n->st->ma);
    if (n->dr!=&nil) n->dmi=mmin(n->dmi,mmin(n->dr->dmi,n->dr->mi-n->val));
    return n;
}
pair<nya*,nya*> split(nya *n,int k)
{
    if (n==&nil) return {&nil,&nil};
    if (n->st->sz>=k) {auto t=split(n->st,k); return {t.first,trr(n,t.second,0)};}
    else {auto t=split(n->dr,k-n->st->sz-1); return {trr(n,t.first,1),t.second};}
}
nya* mer(nya *a,nya *b)
{
    if (a==&nil) return b;
    if (b==&nil) return a;
    if (a->prior>b->prior) {return trr(a,mer(a->dr,b),1);}
    else {return trr(b,mer(a,b->st),0);}
}
int cau(nya *n,int x)
{
    if (n==&nil) return -1000000000;
    if (n->val==x) {return n->st->sz+1;}
    if (n->val>x) return cau(n->st,x);
    return n->st->sz+1+cau(n->dr,x);
}
int cau2(nya *n,int x)
{
    if (n==&nil) return 1;
    if (n->val==x) {return n->st->sz+1;}
    if (n->val>x) return cau2(n->st,x);
    return n->st->sz+1+cau2(n->dr,x);
}
nya* ins(nya *n,int poz,int val)
{
     int y=cau(n,val);
     if (y>=0) return n;
      poz=cau2(n,val);
     auto t=split(n,poz-1);
     return mer(mer(t.first,new nya{&nil,&nil,val,rand(),1,val,val,1000000000}),t.second);
}
nya* ste(nya *n,int poz,int val)
{
    poz=cau(n,val);
    if (poz<0) {out<<-1<<'\n'; return n;}
    auto t=split(n,poz-1);
    auto t2=split(t.second,1);
    return mer(t.first,t2.second);
}
int main()
{
    srand(time(NULL));
    char c;
    int x=0;
    while (in>>c)
    {
        if (c=='I') {in>>x; tr=ins(tr,0,x);}
        else if (c=='S') {in>>x; tr=ste(tr,0,x);}
        else if (c=='C') {in>>x;int poz=cau(tr,x); if (poz<0) {out<<0;} else out<<1; out<<'\n';}
        else {in>>c>>c;if (tr->sz<2) out<<-1; else if (c=='X') out<<tr->ma-tr->mi; else out<<tr->dmi; out<<'\n';}
    }
    return 0;
}