Cod sursa(job #2146687)
Utilizator | Data | 28 februarie 2018 09:52:20 | |
---|---|---|---|
Problema | Hotel | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 7.75 kb |
#include <fstream>
#include <cmath>
#define nmax 100002
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n,m,vel,st,dr;
struct dfr
{
int msi,ms,md;
bool full=false;
bool empt=true;
};
dfr sqr[nmax];
int s[nmax],d[nmax],v[nmax],p[nmax];
int main()
{
fin>>n>>m;
double k1=sqrt((double)n);
int k=sqrt(n);
int cr=k;
int cs=1;
if(k!=k1)
{
k++;
cs=0;
}
if(cs)
{
for(int i=1;i<=k;i++)
{
sqr[i].msi=k;
sqr[i].ms=k;
sqr[i].md=k;
s[i]=(k-1)*i+1;
d[i]=k*i;
v[i]=k;
}
}
else
{
for(int i=1;i<k;i++)
{
sqr[i].msi=cr;
sqr[i].ms=cr;
sqr[i].md=cr;
s[i]=cr*(i-1)+1;
d[i]=cr*i;
v[i]=cr;
}
s[k]=(k-1)*cr+1;
d[k]=n;
v[k]=d[k]-s[k]+1;
}
for(int i=1;i<=m;i++)
{
fin>>vel;
if(vel==3)
{
int sum=0;
int mas=0;
for(int i=1;i<=k;i++)
{
if(sqr[i].empt==true)
{
sum+=v[i];
mas=max(sum,mas);
}
else
{
if(sqr[i].full=true)
{
sum=0;
}
else
{
sum+=sqr[i].ms;
mas=max(sum,mas);
sum=sqr[i].md;
mas=max(sum,sqr[i].msi);
}
}
}
fout<<mas<<"\n";
}
else
{
if(vel==1)
{
fin>>st>>dr;
dr=dr+st-1;
for(int i=1;i<=k;i++)
{
if(st<=s[i]&&dr>=d[i])
{
sqr[i].full=true;
for(int j=s[i];j<=d[i];j++)
p[j]=1;
sqr[i].empt=false;
sqr[i].msi=0;
sqr[i].md=0;
sqr[i].ms=0;
}
else
{
if(st<=d[i]&&d[i]-st<=v[i])
{
for(int j=st;j<=d[i];j++)
p[j]=1;
sqr[i].empt=false;
sqr[i].md=0;
int sum=0;
int k=0;
int prim;
int mas=0;
for(int j=s[i];j<=d[i];j++)
{
sum+=p[j];
if(p[j]==1)
{
mas=max(mas,k);
if(k==j-1)
prim=k;
k=0;
}
else
k++;
}
mas=max(k,mas);
sqr[i].ms=prim;
sqr[i].msi=mas;
if(sum==v[i])
sqr[i].full=true;
}
else
{
if(dr>=s[i]&&dr-s[i]<=v[i])
{
for(int j=dr;j<=s[i];j++)
p[j]=1;
sqr[i].empt=false;
sqr[i].ms=0;
int sum=0;
int k=0;
int prim;
int mas=0;
for(int j=s[i];j<=d[i];j++)
{
sum+=p[j];
if(p[j]==1)
{
mas=max(mas,k);
k=0;
}
else
k++;
}
mas=max(k,mas);
sqr[i].md=k;
sqr[i].msi=mas;
if(sum==v[i])
sqr[i].full=true;
}
}
}
}
}
else
{
fin>>st>>dr;
dr=dr+st-1;
for(int i=1;i<=k;i++)
{
if(st<=s[i]&&dr>=d[i])
{
sqr[i].full=false;
sqr[i].empt=true;
for(int j=s[i];j<=d[i];j++)
p[j]=0;
sqr[i].msi=v[i];
sqr[i].md=v[i];
sqr[i].ms=v[i];
}
else
{
if(st<=d[i]&&d[i]-st<=v[i])
{
for(int j=st;j<=d[i];j++)
p[j]=0;
sqr[i].full=false;
int sum=0;
int k=0;
int prim;
int mas=0;
for(int j=s[i];j<=d[i];j++)
{
sum+=p[j];
if(p[j]==1)
{
mas=max(mas,k);
k=0;
}
else
k++;
}
mas=max(k,mas);
sqr[i].md=k;
sqr[i].msi=mas;
if(!sum)
sqr[i].empt=true;
}
else{
if(dr>=s[i]&&dr-s[i]<=v[i])
{
for(int j=dr;j<=s[i];j++)
p[j]=0;
sqr[i].full=false;
int sum=0;
int k=0;
int prim;
int mas=0;
for(int j=s[i];j<=d[i];j++)
{
sum+=p[j];
if(p[j]==1)
{
mas=max(mas,k);
if(k==j-1)
prim=k;
k=0;
}
else
k++;
}
mas=max(k,mas);
sqr[i].ms=prim;
sqr[i].msi=mas;
if(!sum)
sqr[i].empt=true;
}
}
}
}
}
}
}
return 0;
}