Cod sursa(job #2321454)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 16 ianuarie 2019 08:48:26
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("hotel.in");
ofstream g ("hotel.out");
const int nmax=4e5+3;
struct
{
    int st,dr,val,tot;
}v[nmax];
int lenes[nmax],sol,n,t,a,b,caz;
void update(int st,int dr,int nod,int a,int b,int val)
{
    if(st>dr) return;
    int mij=(st+dr)/2;
    if(lenes[nod]==1)
    {
        v[2*nod].val=mij-st+1;
        v[2*nod].st=mij-st+1;
        v[2*nod].dr=mij-st+1;
        v[2*nod].tot=1;
        lenes[2*nod]=1;
        sol=max(sol,mij-st+1);
        v[2*nod+1].val=dr-mij;
        v[2*nod+1].st=dr-mij;
        v[2*nod+1].dr=dr-mij;
        v[2*nod+1].tot=1;
        lenes[2*nod+1]=1;
        lenes[nod]=0;
        sol=max(sol,dr-mij);
    }
    else if(lenes[nod]==2)
    {
        v[2*nod].val=0;
        v[2*nod].st=0;
        v[2*nod].dr=0;
        v[2*nod].tot=0;
        lenes[2*nod]=2;
        v[2*nod+1].val=0;
        v[2*nod+1].st=0;
        v[2*nod+1].dr=0;
        v[2*nod+1].tot=0;
        lenes[2*nod+1]=2;
        lenes[nod]=0;
    }
    if(a<=st&&dr<=b)
    {
        if(val==1)
        {
            v[nod].val=dr-st+1;
            v[nod].st=dr-st+1;
            v[nod].dr=dr-st+1;
            v[nod].tot=1;
            lenes[nod]=1;
            sol=max(sol,dr-st+1);
            return;
        }
        if(val==2)
        {
            v[nod].val=0;
            v[nod].st=0;
            v[nod].dr=0;
            v[nod].tot=0;
            lenes[nod]=2;
            return;
        }
    }
    if(a<=mij) update(st,mij,2*nod,a,b,val);
    if(b>mij) update(mij+1,dr,2*nod+1,a,b,val);
    v[nod].st=max(v[2*nod].st,v[2*nod].tot*(v[2*nod].val+v[2*nod+1].st));
    v[nod].dr=max(v[2*nod+1].dr,v[2*nod+1].tot*(v[2*nod+1].val+v[2*nod].dr));
    v[nod].tot=v[2*nod].tot*v[2*nod+1].tot;
    v[nod].val=v[nod].tot*(v[2*nod].val+v[2*nod+1].val);
    if(nod==1) sol=max(sol,v[2*nod].dr+v[2*nod+1].st);
    sol=max(sol,v[nod].st);
    sol=max(sol,v[nod].dr);
    sol=max(sol,v[nod].val);
}
int main()
{
    ios::sync_with_stdio(false);
    f>>n>>t;
    update(1,n,1,1,n,1);
    sol=n;
    while(t--)
    {
        f>>caz;
        if(caz==1)
        {
            f>>a>>b;
            b=b+a-1;
            sol=0;
            update(1,n,1,a,b,2);
        }
        if(caz==2)
        {
            f>>a>>b;
            b=b+a-1;
            sol=0;
            update(1,n,1,a,b,1);
        }
        if(caz==3) g<<sol<<'\n';
    }
    return 0;
}