Pagini recente » Cod sursa (job #1355569) | Cod sursa (job #766994) | Cod sursa (job #2316645) | Cod sursa (job #467533) | Cod sursa (job #48868)
Cod sursa(job #48868)
#include <stdio.h>
#define maxx 262144
int n,m,l;
int a[maxx],st[maxx],dr[maxx];
char sum[maxx];
int x,y,z,v;
int min(int a,int b)
{
if (a<b) return a;
return b;
}
void update(int p,int r,int nod,int u)
{
if ((x<=p) && (r<=y))
{
if (v==1)
{
a[nod]=0;
st[nod]=0;
dr[nod]=0;
sum[nod]=1;
}
else {
a[nod]=r-p+1;
st[nod]=r-p+1;
dr[nod]=r-p+1;
sum[nod]=2;
}
}
else {
int q=(p+r)/2;
if (sum[nod]!=0) u=sum[nod];
if (u==1)
{
a[nod*2]=0;
sum[nod*2]=1;
dr[nod*2]=0;
st[nod*2]=0;
if (n>q)
{
dr[nod*2+1]=0;
st[nod*2+1]=0;
a[nod*2+1]=0;
sum[nod*2+1]=1;
}
}
else if (u==2)
{
a[nod*2]=min(q,n)-p+1;
sum[nod*2]=2;
dr[nod*2]=min(q,n)-p+1;
st[nod*2]=min(q,n)-p+1;
if (n>q)
{
dr[nod*2+1]=min(n,r)-q;
sum[nod*2+1]=2;
a[nod*2+1]=min(n,r)-q;
st[nod*2+1]=min(n,r)-q;
}
}
if (x<=q) update(p,q,nod*2,u);
if (y>q) update(q+1,r,nod*2+1,u);
sum[nod]=0;
a[nod]=0;
st[nod]=0;
dr[nod]=0;
if ((sum[nod*2]==1) && (sum[nod*2+1]==1)) sum[nod]=1;
else if ((sum[nod*2]==2) && (sum[nod*2+1]==2)) sum[nod]=2;
if (a[nod*2]>a[nod*2+1]) a[nod]=a[nod*2];
else a[nod]=a[nod*2+1];
if (dr[nod*2]+st[nod*2+1]>a[nod]) a[nod]=dr[nod*2]+st[nod*2+1];
st[nod]=st[nod*2];
if ((sum[nod*2]==2) && (st[nod*2]+st[nod*2+1]>st[nod])) st[nod]=st[nod*2]+st[nod*2+1];
dr[nod]=dr[nod*2+1];
if ((sum[nod*2+1]==2) && (dr[nod*2]+dr[nod*2+1]>dr[nod])) dr[nod]=dr[nod*2]+dr[nod*2+1];
}
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d %d ",&n,&m);
int i,j;
for (l=1;l<n;l<<=1);
for (i=l;i<l+n;i++)
{
st[i]=1;
dr[i]=1;
a[i]=1;
sum[i]=2;
}
for (i=l-1;i>0;i--)
{
sum[i]=2;
a[i]=a[i*2]+a[i*2+1];
st[i]=st[i*2]+st[i*2+1];
dr[i]=dr[i*2]+dr[i*2+1];
}
for (i=1;i<=m;i++)
{
scanf("%d ",&z);
if (z==1)
{
scanf("%d %d ",&x,&y);
y+=x-1;
v=1;
update(1,l,1,0);
}
else if (z==2)
{
scanf("%d %d ",&x,&y);
y+=x-1;
v=0;
update(1,l,1,0);
}
else printf("%d\n",a[1]);
}
return 0;
}