Cod sursa(job #3161962)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 28 octombrie 2023 10:47:16
Problema Hotel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <fstream>

using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n,v[100001],m,c,a,b,x,val,l,nr,lmax;
struct nod
{
    int x,flag;
}aib[400001];
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        aib[nod].x=v[st];
        aib[nod].flag=0;
    }
    else if(st<dr)
    {
        int mid=(st+dr)/2;
       build(nod*2,st,mid);
        build(nod*2+1,mid+1,dr);
        aib[nod].x=min(aib[nod*2].x,aib[nod*2+1].x);
        aib[nod].flag=0;
    }
}
void caut(int nod,int st,int dr)
{

    if(st<dr && lmax<dr-st+1)
    {
        if(aib[nod].flag==1)
        {
            aib[2*nod].x=aib[nod].x;
            aib[2*nod].flag=1;
             aib[2*nod+1].x=aib[nod].x;
            aib[2*nod+1].flag=1;
            aib[nod].flag=0;
        }
        if(aib[nod].x==1)
            lmax=max(lmax,dr-st+1);
        else
        {
           int mid=(st+dr)/2;

            caut(nod*2+1,mid+1,dr);
            caut(nod*2,st,mid);


        }
    }
}
void update(int nod,int st,int dr,int a,int b,int x)
{
    if(a<=st && dr<=b){
        aib[nod].x=x;
        aib[nod].flag=1;
    }
    else
    {
         if(aib[nod].flag==1)
        {
            aib[2*nod].x=aib[nod].x;
            aib[2*nod].flag=1;
             aib[2*nod+1].x=aib[nod].x;
            aib[2*nod+1].flag=1;
            aib[nod].flag=0;
        }
        int mid=(st+dr)/2;
        if(a<=mid)
        {
            update(nod*2,st,mid,a,b,x);

        }
        if(b>=mid+1)
            update(nod*2+1,mid+1,dr,a,b,x);
        aib[nod].x=min(aib[nod*2].x,aib[nod*2+1].x);
    }
}
int main()
{
   fin>>n>>m;
   build(1,1,n);
   for(int i=1;i<=m;i++)
   {
       fin>>c;
       if(c==1)
       {
           fin>>l>>nr;
           update(1,1,n,l,l+nr-1,1);
       }
       else if(c==2)
       {
           fin>>l>>nr;
            update(1,1,n,l,l+nr-1,0);
       }
       else
       {
          lmax=0;
          caut(1,1,n);
          fout<<lmax<<"\n";
       }
   }




    return 0;
}