Cod sursa(job #2955053)

Utilizator PieleVoinescu David Piele Data 16 decembrie 2022 00:03:27
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.42 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define nmax 100005

using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

int n,p;
struct arbore
{
    int st,mij,dr;
} arb[4*nmax];
int lazy[4*nmax];
int cerinta;

void creez(int nod,int st,int dr,int pos)
{
    if(st==dr)
    {
        if(!(nod&1))
        {
            arb[nod].st=0;
            arb[nod].mij=1;
            arb[nod].dr=1;
            return;
        }
        else
        {
            arb[nod].st=1;
            arb[nod].mij=1;
            arb[nod].dr=0;
            return;
        }

    }
    else
    {
        int mid=(st+dr)/2;
        int f_st=2*nod;
        int f_dr=2*nod+1;
        if(pos<=mid)
            creez(f_st,st,mid,pos);
        else if(pos>mid)
            creez(f_dr,mid+1,dr,pos);
        arb[nod].st=max(max(arb[f_st].st,arb[f_st].mij),arb[f_st].dr);
        arb[nod].dr=max(max(arb[f_dr].st,arb[f_dr].mij),arb[f_dr].dr);
        if(arb[f_st].dr+arb[f_st].st==arb[f_st].mij)
            if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
                arb[nod].mij=arb[f_st].mij+arb[f_dr].mij;
            else arb[nod].mij=arb[f_st].mij+arb[f_dr].st;

        else
        {
            if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
                arb[nod].mij=arb[f_st].dr+arb[f_dr].mij;
            else arb[nod].mij=arb[f_st].dr+arb[f_dr].st;

        }
    }
}

void propag(int nod,int st,int dr)
{
    if(lazy[nod]==0)
        return;
    if(lazy[nod]==1)
    {
        if(dr-st==2){
        if(nod&1){
                arb[nod].st=1;
                arb[nod].mij=1;
                arb[nod].dr=0;}
        }
        else if(dr-st<=1){
            if(!(nod&1))
            {
                arb[nod].st=0;
                arb[nod].mij=1;
                arb[nod].dr=1;
            }
            else
            {
                arb[nod].st=1;
                arb[nod].mij=1;
                arb[nod].dr=0;
            }
        }
         else{
        arb[nod].st=dr-st+1;
        arb[nod].dr=dr-st+1;
        arb[nod].mij=arb[nod].st+arb[nod].dr;
         }
    }
    else if(lazy[nod]==2)
    {
        arb[nod].st=0;
        arb[nod].dr=0;
        arb[nod].mij=0;
    }
    if(st!=dr)
    {
        lazy[2*nod]=lazy[nod];
        lazy[2*nod+1]=lazy[nod];
    }
    lazy[nod]=0;
}

void pune(int nod,int st,int dr,int ST,int DR)
{
    propag(nod,st,dr);
    if(st>=ST && dr<=DR)
    {
        lazy[nod]=2;
        return;
    }
    int mid=(st+dr)/2;
    int f_st=2*nod;
    int f_dr=2*nod+1;
    if(ST<=mid)
        pune(f_st,st,mid,ST,DR);
    if(DR>mid)
        pune(f_dr,mid+1,dr,ST,DR);
    propag(f_st,st,dr);
    propag(f_dr,st,dr);
    arb[nod].st=max(max(arb[f_st].st,arb[f_st].mij),arb[f_st].dr);
    arb[nod].dr=max(max(arb[f_dr].st,arb[f_dr].mij),arb[f_dr].dr);
    if(arb[f_st].dr==0)
        if(arb[f_dr].st!=0)
            if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
                arb[nod].mij=arb[f_dr].mij;
            else arb[nod].mij=arb[f_dr].st;
        else arb[nod].mij=0;
    else if(arb[f_st].dr+arb[f_st].st==arb[f_st].mij)
        if(arb[f_dr].st!=0)
            if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
                arb[nod].mij=arb[f_st].mij+arb[f_dr].mij;
            else arb[nod].mij=arb[f_st].mij+arb[f_dr].st;
        else arb[nod].mij=arb[f_st].mij;
    else
    {
        if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
            arb[nod].mij=arb[f_st].dr+arb[f_dr].mij;
        else arb[nod].mij=arb[f_st].dr+arb[f_dr].st;

    }

}

void scoate(int nod,int st,int dr,int ST,int DR)
{
    propag(nod,st,dr);
    if(st>=ST && dr<=DR)
    {
        lazy[nod]=1;
        return;
    }
    int mid=(st+dr)/2;
    int f_st=2*nod;
    int f_dr=2*nod+1;
    if(ST<=mid)
        scoate(f_st,st,mid,ST,DR);
    if(DR>mid)
        scoate(f_dr,mid+1,dr,ST,DR);
    propag(f_st,st,dr);
    propag(f_dr,st,dr);
    arb[nod].st=max(max(arb[f_st].st,arb[f_st].mij),arb[f_st].dr);
    arb[nod].dr=max(max(arb[f_dr].st,arb[f_dr].mij),arb[f_dr].dr);
    if(arb[f_st].dr==0)
        if(arb[f_dr].st!=0)
            if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
                arb[nod].mij=arb[f_dr].mij;
            else arb[nod].mij=arb[f_dr].st;
        else arb[nod].mij=0;
    else if(arb[f_st].dr+arb[f_st].st==arb[f_st].mij)
        if(arb[f_dr].st!=0)
            if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
                arb[nod].mij=arb[f_st].mij+arb[f_dr].mij;
            else arb[nod].mij=arb[f_st].mij+arb[f_dr].st;
        else arb[nod].mij=arb[f_st].mij;
    else
    {
        if(arb[f_dr].dr+arb[f_dr].st==arb[f_dr].mij)
            arb[nod].mij=arb[f_st].dr+arb[f_dr].mij;
        else arb[nod].mij=arb[f_st].dr+arb[f_dr].st;

    }

}
void citire()
{
    fin>>n>>p;
    int st,dr;
    for(int i=1; i<=n; ++i)
        creez(1,1,n,i);
    while(p)
    {
        fin>>cerinta;
        if(cerinta==3)
        {
            propag(1,1,n);
            fout<<max(max(arb[1].st,arb[1].dr),arb[1].mij)<<'\n';
        }
        else if(cerinta==2)
        {
            fin>>st>>dr;
            dr=dr+st-1;
            scoate(1,1,n,st,dr);
        }
        else if(cerinta==1)
        {
            fin>>st>>dr;
            dr=dr+st-1;
            pune(1,1,n,st,dr);

        }

        p--;
    }

}

int main()
{
    citire();
    return 0;
}