Cod sursa(job #2632399)

Utilizator AlexMariMarinescu Alexandru AlexMari Data 3 iulie 2020 10:55:27
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

int n,m;

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


void update(int node,int l,int r,int st,int dr,int val)
{
    if(l>=st&&r<=dr)
    {
        aint[node].viz=1;
        if(val==1)
            aint[node].ans=aint[node].left=aint[node].right=0;
        else
             aint[node].ans=aint[node].left=aint[node].right=r-l+1;
       return;
    }
    int mijl=(l+r)/2;
    if(aint[node].viz==1)
    {
        aint[node].viz=0;
        if(aint[node].ans==0)
        {
            aint[2*node].ans=aint[2*node].left=aint[2*node].right=0;
            aint[2*node+1].ans=aint[2*node+1].left=aint[2*node+1].right=0;
        }
        else
        {
            aint[2*node].ans=aint[2*node].left=aint[2*node].right=mijl-l+1;
            aint[2*node+1].ans=aint[2*node+1].left=aint[2*node+1].right=r-mijl;
        }
        aint[2*node].viz=aint[2*node+1].viz=1;
    }
    if(st<=mijl)
        update(2*node,l,mijl,st,dr,val);
        if(dr>=mijl+1)
        update(2*node+1,mijl+1,r,st,dr,val);
    aint[node].ans=max(max(aint[2*node].ans,aint[2*node+1].ans),(aint[2*node+1].left+aint[2*node].right));
    aint[node].left=aint[2*node].left;
    aint[node].right=aint[2*node+1].right;
    if(aint[node].left==mijl-l+1)
            aint[node].left+=aint[2*node+1].left;
    if(aint[node].right==r-mijl)
        aint[node].right+=aint[2*node].right;
}
int main()
{
    int i,x,y,op;
    fin>>n>>m;
    update(1,1,n,1,n,2);
    for(i=1;i<=m;i++)
    {
        fin>>op;
        if(op==3)
            fout<<aint[1].ans<<'\n';
        else
        {
            fin>>x>>y;
            update(1,1,n,x,x+y-1,op);
        }
    }
    return 0;
}