Pagini recente » Cod sursa (job #646356) | Cod sursa (job #2234046) | Cod sursa (job #492650) | Cod sursa (job #2380999) | Cod sursa (job #600832)
Cod sursa(job #600832)
#include<cstdio>
const int N = (1<<18);
struct tree
{
int stanga,dreapta,tot;
};
int n,p,a,b;
tree t[N];
inline int maxim(int x,int y)
{
return x>y ? x : y;
}
void update(int poz,int st,int dr,int tip)
{
if(a<=st && dr<=b)
{
if(tip==1)
t[poz].stanga=t[poz].dreapta=t[poz].tot=0;
else
t[poz].stanga=t[poz].dreapta=t[poz].tot=dr-st+1;
return;
}
int mid=(st+dr)>>1;
if(t[poz].tot==dr-st+1)
{
t[poz<<1].stanga=t[poz<<1].dreapta=t[poz<<1].tot=mid-st+1;
t[(poz<<1)+1].stanga=t[(poz<<1)+1].dreapta=t[(poz<<1)+1].tot=dr-mid;
}
if(t[poz].tot==0)
{
t[poz<<1].stanga=t[poz<<1].dreapta=t[poz<<1].tot=0;
t[(poz<<1)+1].stanga=t[(poz<<1)+1].dreapta=t[(poz<<1)+1].tot=0;
}
if(a<=mid)
update(poz<<1,st,mid,tip);
if(b>mid)
update((poz<<1)+1,mid+1,dr,tip);
t[poz].stanga=t[poz<<1].stanga;
if(t[poz<<1].tot==mid-st+1)
t[poz].stanga+=t[(poz<<1)+1].stanga;
t[poz].dreapta=t[(poz<<1)+1].dreapta;
if(t[(poz<<1)+1].tot==dr-mid)
t[poz].dreapta+=t[poz<<1].dreapta;
t[poz].tot=maxim(t[poz<<1].dreapta+t[(poz<<1)+1].stanga,maxim(t[poz<<1].tot,t[(poz<<1)+1].tot));
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int tip;
scanf("%d%d",&n,&p);
t[1].stanga=t[1].dreapta=t[1].tot=n;
while(p--)
{
scanf("%d",&tip);
if(tip==3)
{
printf("%d\n",t[1].tot);
continue;
}
scanf("%d%d",&a,&b);
b+=a-1;
update(1,1,n,tip);
}
return 0;
}