Cod sursa(job #1952615)

Utilizator Garen456Paun Tudor Garen456 Data 4 aprilie 2017 11:34:03
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");

struct swag
{ int best,r,l;
};
swag a[400005];
int n,p,narb=1,op;

void update(int nd,int x,int y,int st,int dr)
{  // fout<<nd<<" "<<x<<" "<<y<<" "<<st<<" "<<dr<<"\n";
    if(x==st && y==dr)
    {  if(op==1) a[nd].best=a[nd].l=a[nd].r=0;
       else a[nd].best=a[nd].l=a[nd].r=dr-st+1;
       //fout<<nd<<" "<<dr-st+1<<" "<<op<<"\n";
       int mijl=(st+dr)/2;
       if(st!=dr)
       {update(2*nd,x,mijl,st,mijl);
       update(2*nd+1,mijl+1,y,mijl+1,dr);
       }
        return;
    }
    int mijl=(st+dr)/2;
    if(y<=mijl)
        update(2*nd,x,y,st,mijl);
  else
    if(x>mijl)
        update(2*nd+1,x,y,mijl+1,dr);
    else
    { update(2*nd,x,mijl,st,mijl);
       update(2*nd+1,mijl+1,y,mijl+1,dr);
    }

    a[nd].best=max(max(a[2*nd].best,a[2*nd+1].best),a[2*nd].r+a[2*nd+1].l);
    a[nd].l=a[2*nd].l;
    a[nd].r=a[2*nd+1].r;
     if(a[nd].l==mijl-st+1)
        a[nd].l+=a[2*nd+1].l;
     if(a[nd].r==dr-mijl)
        a[nd].r+=a[2*nd].r;

}

int main()
{
    fin>>n>>p;
    while(narb<n) narb*=2;
    int i,x,y;
    for(i=0;i<n;++i)
        a[narb+i].best=a[narb+i].l=a[narb+i].r=1;
    for(i=narb-1;i>=1;--i)
        a[i].best=a[i].r=a[i].l=a[i*2].r+a[i*2+1].l;
    for(i=1;i<=p;++i)
    { fin>>op;
        if(op==3)
            fout<<a[1].best<<"\n";
        else
        {fin>>x>>y;
            y+=x-1;
            update(1,x,y,1,narb);
           // fout<<"\n";
        }
    }

    return 0;
}