Cod sursa(job #2801178)

Utilizator proflaurianPanaete Adrian proflaurian Data 15 noiembrie 2021 13:11:46
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
const int N = 100002;
set<int> segm;
multiset<int> vals;
int n,p,E,tip[N],prv[N],nxt[N];
void upd(int,int,int);
inline void pushSegm(int,int),popSegm(int),pushVals(int),popVals(int),link(int,int);
int main()
{
    f>>n>>p;E=n+1;
    pushSegm(1,1);pushSegm(E,2);link(1,E);pushVals(1);vals.insert(0);
    for(;p;p--)
    {
        int op,st,lg;
        f>>op;
        if(op==3){g<<-*vals.begin()<<'\n';}
        else {f>>st>>lg;upd(st,st+lg,op);}
    }
    return 0;
}

void upd(int b,int c,int T)
{
    int t,a,d,L,R;
    t=3-T;d=*segm.upper_bound(b);a=prv[d];L=prv[a];R=nxt[d];
    if(a<b)
    {
        if(c<d){popVals(a);pushSegm(b,t);pushSegm(c,T);link(a,b);link(b,c);link(c,d);pushVals(a);pushVals(b);pushVals(c);return;}
        if(c<E){popVals(a);popVals(d);popSegm(d);pushSegm(b,t);link(a,b);link(b,R);pushVals(a);pushVals(b);return;}
        popVals(a);pushSegm(b,t);link(a,b);link(b,c);pushVals(a);pushVals(b);return;
    }
    if(a>1)
    {
        if(c<d){popVals(L);popVals(a);popSegm(a);pushSegm(c,T);link(L,c);link(c,d);pushVals(L);pushVals(c);return;
        }
        if(c<E){popVals(L);popVals(a);popVals(d);popSegm(a);popSegm(d);link(L,R);pushVals(L);return;}
        popVals(L);popVals(a);popSegm(a);link(L,c);pushVals(L);return;
    }
    if(c<d){popVals(a);pushSegm(b,t);pushSegm(c,T);link(b,c);link(c,d);pushVals(b);pushVals(c);return;}
    if(c<E){popVals(a);popVals(d);pushSegm(b,t);popSegm(d);link(b,R);pushVals(b);return;}
    popVals(a);pushSegm(b,t);pushVals(b);
}
inline void popVals(int x){if(tip[x]==1)vals.erase(vals.find(x-nxt[x]));}
inline void pushVals(int x){if(tip[x]==1)vals.insert(x-nxt[x]);}
inline void popSegm(int x){tip[x]=nxt[x]=prv[x]=0;segm.erase(x);}
inline void pushSegm(int x,int t){tip[x]=t;segm.insert(x);}
inline void link(int x,int y){nxt[x]=y;prv[y]=x;}