Pagini recente » Cod sursa (job #1333921) | Cod sursa (job #1234002) | Cod sursa (job #1713938) | Cod sursa (job #1692819) | Cod sursa (job #168478)
Cod sursa(job #168478)
#include<fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
#define Max 100000
int sol[5*Max],n,start,end;
int sst[5*Max],sdr[5*Max];
void modi1(int,int,int);
void modi2(int,int,int);
int main()
{
int t,k;
fin>>n>>t;
sol[1]=sst[1]=sdr[1]=n;
while(t--)
{
fin>>k;
if(k<3)
{
fin>>start>>end;
end=start+end-1;
if(k==1) modi1(1,1,n);
else modi2(1,1,n);
}
else fout<<sol[1]<<'\n';
}
return 0;
}
void modi1(int k,int i,int j)
{
if(start<=i&&j<=end)
{
sol[k]=sst[k]=sdr[k]=0;
return;
}
int mij=(i+j)/2;
if(sol[k]==j-i+1)
{
sol[2*k]=sst[2*k]=sdr[2*k]=mij-i+1;
sol[2*k+1]=sst[2*k+1]=sdr[2*k+1]=j-mij;
}
if(start<=mij) modi1(2*k,i,mij);
if(mij<end) modi1(2*k+1,mij+1,j);
sol[k]=max(sol[2*k],sol[2*k+1]);
sol[k]=max(sol[k],sdr[2*k]+sst[2*k+1]);
sst[k]=sst[2*k];
if(mij-i+1==sst[2*k])
sst[k]+=sst[2*k+1];
sdr[k]=sdr[2*k+1];
if(j-mij==sdr[2*k+1])
sdr[k]+=sdr[2*k];
}
void modi2(int k,int i,int j)
{
if(start<=i&&j<=end)
{
sol[k]=sst[k]=sdr[k]=j-i+1;
return;
}
if(sol[k]==0)
{
sol[2*k]=sst[2*k]=sdr[2*k]=0;
sol[2*k+1]=sst[2*k+1]=sdr[2*k+1]=0;
}
int mij=(i+j)/2;
if(start<=mij) modi2(2*k,i,mij);
if(mij<end) modi2(2*k+1,mij+1,j);
sol[k]=max(sol[2*k],sol[2*k+1]);
sol[k]=max(sol[k],sdr[2*k]+sst[2*k+1]);
sst[k]=sst[2*k];
if(mij-i+1==sst[2*k])
sst[k]+=sst[2*k+1];
sdr[k]=sdr[2*k+1];
if(j-mij==sdr[2*k+1])
sdr[k]+=sdr[2*k];
}