Pagini recente » Cod sursa (job #2566994) | Cod sursa (job #2584015) | Cod sursa (job #989723) | Cod sursa (job #142966) | Cod sursa (job #2464991)
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n,m,i,a,b,c,val;
struct numar{
int nr,left,right,lazy;
}ai[300005];
void update(int nod, int st, int dr){
if(a<=st && dr<=b){
if(val==1)
ai[nod].nr=ai[nod].left=ai[nod].right=dr-st+1;
else{
ai[nod].nr=0;
ai[nod].left=0;
ai[nod].right=0;
}
ai[nod].lazy=1;
return;
}
int mid=(st+dr)/2;
if(ai[nod].lazy){
ai[nod].lazy=0;
if(ai[nod].nr!=0){
ai[2*nod].nr=ai[2*nod].left=ai[2*nod].right=mid-st+1;
ai[2*nod+1].nr=ai[2*nod+1].left=ai[2*nod+1].right=dr-mid;
}
else{
ai[2*nod].nr=ai[2*nod+1].nr=0;
ai[2*nod].left=ai[2*nod].right=0;
ai[2*nod+1].left=ai[2*nod+1].right=0;
}
ai[2*nod].lazy=ai[2*nod+1].lazy=1;
}
if(mid>=a)
update(2*nod,st,mid);
if(mid<b)
update(2*nod+1,mid+1,dr);
ai[nod].nr=max(ai[2*nod].nr,ai[2*nod+1].nr);
ai[nod].nr = max(ai[nod].nr, ai[2*nod].right + ai[2*nod+1].left);
ai[nod].left = ai[2*nod].left;
if(ai[2*nod].left == mid-st+1)
ai[nod].left += ai[2*nod+1].left;
ai[nod].right = ai[2*nod+1].right;
if(ai[2*nod+1].right == dr-mid)
ai[nod].right += ai[2*nod].right;
}
int main(){
fin>>n>>m;
a=1, b=n, val=1;
update(1,1,n);
for(i=1;i<=m;i++){
fin>>c;
if(c==3){
int Max=ai[1].nr;
Max=max(Max, max(ai[1].left,ai[1].right));
fout<<Max<<'\n';
continue;
}
fin>>a>>b;
b=a+b-1;
if(c==1)
val=0;
else
val=1;
update(1,1,n);
}
return 0;
}