Cod sursa(job #3163630)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 31 octombrie 2023 18:32:54
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 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,st,dr,ss,flag,flagx;
}aib[400001];
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        aib[nod].x=v[st];
        aib[nod].flag=0;
        aib[nod].st=aib[nod].dr=aib[nod].ss=1;
        aib[nod].flagx=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;
         aib[nod].st=aib[nod].dr=aib[nod].ss=dr-st+1;
         aib[nod].flagx=0;
    }
}

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;
        aib[nod].flagx=x;
        if(x==0)
         aib[nod].st=aib[nod].dr=aib[nod].ss=dr-st+1;
        else
            aib[nod].st=aib[nod].dr=aib[nod].ss=0;
    }
    else
    {
        int mid=(st+dr)/2;
         if(aib[nod].flag==1)
        {
            int xc=aib[nod].flagx;
            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(xc==1){
                aib[nod*2].st=aib[nod*2].dr=aib[nod*2].ss=0;
                aib[nod*2+1].st=aib[nod*2+1].dr=aib[nod*2+1].ss=0;
            }
            else{
                aib[nod*2].st=aib[nod*2].dr=aib[nod*2].ss=mid-st+1;
                aib[nod*2+1].st=aib[nod*2+1].dr=aib[nod*2+1].ss=dr-mid;
            }
            aib[nod*2].flagx=aib[nod*2+1].flagx=xc;
        }

        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);
        aib[nod].ss=max(aib[nod*2].dr+aib[nod*2+1].st,aib[nod*2].ss);
        aib[nod].ss=max(aib[nod].ss,aib[nod*2+1].ss);
        aib[nod].st=aib[nod*2].st;
        if(aib[nod*2].st==mid-st+1)
            aib[nod].st=aib[nod*2].st+aib[nod*2+1].st;
        aib[nod].dr=aib[nod*2+1].dr;
        if(aib[nod*2+1].dr==dr-mid)
            aib[nod].dr=aib[nod*2].dr+aib[nod*2+1].dr;

    }
}
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
       {
          fout<<aib[1].ss<<"\n";
       }
   }




    return 0;
}