Pagini recente » Cod sursa (job #2839197) | Cod sursa (job #5163) | Cod sursa (job #738003) | Cod sursa (job #1728785) | Cod sursa (job #53764)
Cod sursa(job #53764)
#include<stdio.h>
const int maxn = 262144 + 1;
int st[maxn];
int end[maxn];
int lim;
int i;
int j;
int n;
int p;
int x;
int mark[maxn];
int maxis[maxn];
int maxid[maxn];
int maxim[maxn];
int sta;
int en;
int max(int a, int b)
{
if (a < b) return b;
return a;
}
void update2(int beg,int fin,int nod)
{
int mid = (st[nod] + end[nod]) / 2;
if (beg == st[nod] && fin == end[nod])
{
if (x == 1)
{
mark[nod] = 0;
maxis[nod] = 0;
maxid[nod] = 0;
maxim[nod] = 0;
}
else
{
maxis[nod] = fin - beg + 1;
maxid[nod] = fin - beg + 1;
maxim[nod] = fin - beg + 1;
mark[nod] = 1;
}
return ;
}
if (mark[nod] == 0)
{
maxim[nod * 2 + 1] = 0;
maxis[nod * 2 + 1] = 0;
maxid[nod * 2 + 1] = 0;
maxim[nod * 2] = 0;
maxis[nod * 2] = 0;
maxid[nod * 2] = 0;
mark[nod * 2 + 1] = 0;
mark[nod * 2] = 0;
}
if (mark[nod] == 1)
{
if ( st[nod * 2] != 0 && nod * 2 <= lim)
{
maxim[nod * 2] = end[nod * 2] - st[nod * 2] + 1;
maxis[nod * 2] = end[nod * 2] - st[nod * 2] + 1;
maxid[nod * 2] = end[nod * 2] - st[nod * 2] + 1;
mark[nod * 2] = 1;
}
if (st[nod * 2 + 1] != 0 && nod * 2 + 1 <= lim)
{
maxim[nod * 2 + 1] = end[nod * 2 + 1] - st[nod * 2 + 1] + 1;
maxis[nod * 2 + 1] = end[nod * 2 + 1] - st[nod * 2 + 1] + 1;
maxid[nod * 2 + 1] = end[nod * 2 + 1] - st[nod * 2 + 1] + 1;
mark[nod * 2 + 1] = 1;
}
}
if (mid < beg)
{
update2(beg,fin,nod * 2 + 1);
}
if (mid >= fin) update2(beg,fin,nod * 2);
if (mid >= beg && mid < fin)
{
update2(beg,mid,nod * 2);
update2(mid + 1,fin,nod * 2 + 1);
}
if (mark[nod * 2 + 1] != mark[nod * 2]) mark[nod] = 2;
else mark[nod] = mark[nod * 2];
maxim[nod] = max(maxid[nod * 2] + maxis[nod * 2 + 1], max(maxim[nod * 2],maxim[nod * 2 + 1]));
maxis[nod] = maxis[nod * 2];
if (maxis[nod * 2] == end[nod * 2] - st[nod * 2] + 1) maxis[nod] += maxis[nod * 2 + 1];
maxid[nod] = maxid[nod * 2 + 1];
if (maxid[nod * 2 + 1] == end[nod * 2 + 1] - st[nod * 2 + 1] + 1) maxid[nod] += maxid[nod * 2];
}
/*
void update(int beg,int fin,int nod)
{
int mid = (st[nod] + end[nod]) / 2;
if (beg == st[nod] && fin == end[nod])
{
maxis[nod] = fin - beg + 1;
maxid[nod] = fin - beg + 1;
maxim[nod] = fin - beg + 1;
return ;
}
if (mid < beg)
{
update(beg,fin,nod * 2 + 1);
}
if (mid >= fin)
{
update(beg,fin,nod * 2);
}
if (mid >= beg && mid < fin)
{
update(beg,mid,nod * 2);
update(mid + 1,fin,nod * 2 + 1);
}
maxim[nod] = max(maxid[nod * 2] + maxis[nod * 2 + 1], max(maxim[nod * 2],maxim[nod * 2 + 1]));
maxis[nod] = maxis[nod * 2];
if (maxis[nod * 2] == end[nod * 2] - st[nod * 2] + 1) maxis[nod] += maxis[nod * 2 + 1];
maxid[nod] = maxid[nod * 2 + 1];
if (maxid[nod * 2 + 1] == end[nod * 2 + 1] - st[nod * 2 + 1] + 1) maxid[nod] += maxid[nod * 2];
}
*/
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d %d",&n,&p);
for(lim = 1;lim <= 2 * n; lim <<= 1)
{
}
st[1] = 1;
end[1] = n;
for(i = 1;i <= lim; ++i)
{
if (st[i] != end[i])
{
st[i * 2] = st[i];
end[i * 2] = (st[i] + end[i]) / 2;
st[i * 2 + 1] = end[i * 2] + 1;
end[i * 2 + 1] = end[i];
}
maxid[i] = end[i] - st[i] + 1;
maxis[i] = maxid[i];
maxim[i] = maxid[i];
mark[i] = 1;
}
for(i = 1;i <= p; ++i)
{
scanf("%d",&x);
if (x == 3) printf("%d\n",maxim[1]);
if (x == 1)
{
scanf("%d %d",&sta,&en);
en += sta - 1;
update2(sta,en,1);
}
if (x == 2)
{
scanf("%d %d",&sta,&en);
en += sta - 1;
update2(sta,en,1);
}
}
return 0;
}
//12 4 4 6 10