Cod sursa(job #2918223)

Utilizator Theo14Ancuta Theodor Theo14 Data 10 august 2022 15:09:26
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include<bits/stdc++.h>
using namespace std;

ifstream f("hotel.in");
ofstream g("hotel.out");

///st=lungimea celei mai lungi secvente de 0 care incepe din capatul din st(->)
///dr=lungimea celei mai lungi secvente de 0 care incepe din capatul din dr(<-)
///ans=lungimea maxima a unei secvente de 0 pe intervalul st,dr

struct node
{
    int left,right,ans,viz;
} aint[400005];

void update(int nod, int st, int dr, int l, int r, int val)
{
    if(l<=st && r>=dr)
    {
        aint[nod].viz=1;
        if(val==1)
            aint[nod].left=aint[nod].right=aint[nod].ans=0;
        else
            aint[nod].left=aint[nod].right=aint[nod].ans=dr-st+1;
        return;
    }
    int mij=(st+dr)/2;
    if(aint[nod].viz==1)
    {
        aint[nod].viz=0;
        if(aint[nod].ans==0)
        {
            aint[2*nod].ans=aint[2*nod].left=aint[2*nod].right=0;
            aint[2*nod+1].ans=aint[2*nod+1].left=aint[2*nod+1].right=0;
        }
        else
        {
            aint[2*nod].ans=aint[2*nod].left=aint[2*nod].right=mij-st+1;
            aint[2*nod+1].ans=aint[2*nod+1].left=aint[2*nod+1].right=dr-mij;
        }
        aint[nod*2].viz=aint[nod*2+1].viz=1;
    }
    if(l<=mij)
        update(2*nod,st,mij,l,r,val);
    if(r>mij)
        update(2*nod+1,mij+1,dr,l,r,val);
    aint[nod].ans=max({aint[nod*2].ans,aint[nod*2+1].ans,aint[nod*2].right+aint[nod*2+1].left});
    aint[nod].left=aint[nod*2].left;
    aint[nod].right=aint[nod*2+1].right;
    if(aint[nod].left==mij-st+1)
        aint[nod].left+=aint[2*nod+1].left;
    if(aint[nod].right==dr-mij)
        aint[nod].right+=aint[2*nod].right;
}

int main()
{
    int n,m,i,a,b,nr;
    f>>n>>m;
    update(1,1,n,1,n,2);
    for(i=1; i<=m; i++)
    {
        f>>nr;
        if(nr==3)
            g<<aint[1].ans<<'\n';
        else
        {
            f>>a>>b;
            update(1,1,n,a,a+b-1,nr);
        }
    }
    return 0;
}