Cod sursa(job #3160957)

Utilizator danyyyDaniel danyyy Data 25 octombrie 2023 12:20:55
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int N=1<<19;
int aint[N],lazy[N],sum=0,smax;
void cerinta1(int p,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
    {
        aint[p]=dr-st+1;
        lazy[p]=1;
    }
    else
    {
        int mij=(st+dr)/2,fs=p*2,fd=p*2+1;
        if(lazy[p]!=0)
        {
            if(lazy[p]==1)
            {
                lazy[p]=0;
                lazy[fd]=1;
                lazy[fs]=1;
                aint[fs]=mij-st+1;
                aint[fd]=dr-mij;
            }
            else
            {
                lazy[p]=0;
                aint[fd]=0;
                aint[fs]=0;
                lazy[fs]=-1;
                lazy[fd]=-1;
            }
        }
        if(a<=mij)cerinta1(fs,st,mij,a,b);
        if(b>mij)cerinta1(fd,mij+1,dr,a,b);
        aint[p]=aint[fd]+aint[fs];
    }
}
void cerinta2(int p,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
    {
        aint[p]=0;
        lazy[p]=-1;
    }
    else
    {
        int mij=(st+dr)/2,fs=p*2,fd=p*2+1;
        if(lazy[p]!=0)
        {
            if(lazy[p]==1)
            {
                lazy[p]=0;
                lazy[fd]=1;
                lazy[fs]=1;
                aint[fs]=mij-st+1;
                aint[fd]=dr-mij;
            }
            else
            {
                lazy[p]=0;
                aint[fd]=0;
                aint[fs]=0;
                lazy[fs]=-1;
                lazy[fd]=-1;
            }
        }
        if(a<=mij)cerinta2(fs,st,mij,a,b);
        if(b>mij)cerinta2(fd,mij+1,dr,a,b);
        aint[p]=aint[fd]+aint[fs];
    }
}
void cerinta3(int p,int st,int dr)
{
    if(aint[p]==0)
    {
        sum=sum+dr-st+1;
    }
    else if(aint[p]==dr-st+1)
    {
        if(smax<sum)smax=sum;
        sum=0;
    }
    else
    {

        int mij=(st+dr)/2,fs=2*p,fd=2*p+1;
        if(lazy[p]!=0)
        {
            if(lazy[p]==1)
            {
                lazy[p]=0;
                lazy[fd]=1;
                lazy[fs]=1;
                aint[fs]=mij-st+1;
                aint[fd]=dr-mij;
            }
            else
            {
                lazy[p]=0;
                aint[fd]=0;
                aint[fs]=0;
                lazy[fs]=-1;
                lazy[fd]=-1;
            }
        }
        cerinta3(fs,st,mij);
        cerinta3(fd,mij+1,dr);
    }
}
int main()
{
    int n,q;
    fin>>n;
    fin>>q;
    for(int i=1; i<=q; i++)
    {
        int tip,a,x,b;
        fin>>tip;
        if(tip==1)
        {
            fin>>a>>x;
            b=a+x-1;
            cerinta1(1,1,n,a,b);
        }
        else if(tip==2)
        {
            fin>>a>>x;
            b=a+x-1;
            cerinta2(1,1,n,a,b);
        }
        else
        {
            sum=0,smax=-1;
            cerinta3(1,1,n);
            if(smax<sum)smax=sum;
            fout<<smax<<'\n';
        }
    }
}