http://acm.hust.edu.cn/vjudge/contest/view.action?cid=78124#problem/D
//想看题目的@willinglive
直接暴力维护就可以了。。。然后折叠超过区间的时候用翻转标记维护一下。【大概直接做也可以过。。?并没有尝试】
#include<cstdio>
using namespace std;
int n;
int tr[100001];
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int x,int xx)
{
int i;
for(i=x;i<=n;i+=lowbit(i))
tr[i]+=xx;
}
inline int sum(int x)
{
int i;
int s=0;
for(i=x;i>=1;i-=lowbit(i))
s+=tr[i];
return s;
}
int main()
{
int q;
scanf("%d%d",&n,&q);
int i,j;
for(i=1;i<=n;i++)
add(i,1);
int x;
int s,t;
int l=1,r=n;
bool rev=false;
for(i=1;i<=q;i++)
{
scanf("%d",&x);
if(x==1)
{
scanf("%d",&s);
if(s+s+l-1>r)
{
rev=!rev;
s=(r-l+1)-s;
}
if(rev)
{
for(j=r-s+1;j<=r;j++)
{
int xx=sum(j)-sum(j-1);
int loc=r-s+1-(j-(r-s+1)+1);
add(loc,xx);
add(j,-xx);
}
r-=s;
}
else
{
for(j=l;j<=l+s-1;j++)
{
int xx=sum(j)-sum(j-1);
int loc=l+s-1+(l+s-j);
add(loc,xx);
add(j,-xx);
}
l+=s;
if(l>n)
{
l-=n;
r-=n;
}
}
}
else if(x==2)
{
scanf("%d%d",&s,&t);
if(!rev)
{
s=s+l-1;
t=t+l-1;
}
else
{
int tt=s;
s=r-t;
t=r-tt;
}
printf("%d\n",sum(t)-sum(s));
}
}
return 0;
}