Pagini recente » Cod sursa (job #2227284) | Cod sursa (job #3211288) | Cod sursa (job #2077602) | Cod sursa (job #1750918) | Cod sursa (job #284995)
Cod sursa(job #284995)
#include <stdio.h>
#define maxn 600010
using namespace std;
long n, i, j, k, m, cod, left, right;
long st[maxn], dr[maxn], sum[maxn];
void init(long x, long l, long r)
{
long m=(l+r)/2;
st[x]=dr[x]=sum[x]=r-l+1;
if(l==r) return;
init(x*2, l, m);
init(x*2+1, m+1, r);
}
void update(long x, long l, long r)
{
long m=(l+r)/2;
// printf("*");
if(left <= l && r <= right)
{
if(cod==1)
{
st[x]=dr[x]=sum[x]=0;
}
else
{
st[x]=dr[x]=sum[x]=l-r+1;
}
return;
}
if(cod==1 && sum[x]==(l-r+1) )
{
sum[x*2]=dr[x*2]=st[x*2]=m-l+1;
sum[x*2+1]=dr[x*2+1]=st[x*2+1]=r-m;
}
if(cod==2 && sum[x]==0)
{
sum[x*2]=dr[x*2]=st[x*2]=0;
sum[x*2+1]=dr[x*2+1]=st[x*2+1]=0;
}
if(left<=m) update(2*x, l, m);
if(m<right) update(2*x+1, m+1, r);
if(st[2*x]==m-l+1)
{
st[x]=st[2*x]+st[2*x+1];
}
else
{
st[x]=st[2*x];
}
if(dr[2*x+1]==r-m)
{
dr[x]=dr[2*x+1]+dr[2*x];
}
else
{
dr[x]=dr[2*x+1];
}
sum[x]=st[2*x+1]+dr[2*x];
if(dr[x]>sum[x]) sum[x]=dr[x];
if(st[x]>sum[x]) sum[x]=st[x];
if(sum[2*x]>sum[x]) sum[x]=sum[2*x];
if(sum[2*x+1]>sum[x]) sum[x]=sum[2*x+1];
}
int main()
{
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d %d", &n, &m);
init(1, 1, n);
for(i=1; i<=m; i++)
{
scanf("%d", &cod);
if(cod<=2)
{
scanf("%d %d", &left, &right);
right+=left-1;
// printf("%d %d\n", left, right);
update(1, 1, n);
}
else printf("%d\n", sum[1]);
}
return 0;
}