from collections import deque
class node:
def __init__(self):
self.arr = deque([0,0,0])
def buildTree(si,ss,se):
if ss == se:
segmentTree[si].arr[0]=1
segmentTree[si].arr[1]=0
segmentTree[si].arr[2]=0
return
mid = (ss+se)//2
buildTree(2*si,ss,mid)
buildTree(2*si+1,mid+1,se)
segmentTree[si].arr[0] = segmentTree[2*si].arr[0] + segmentTree[2*si+1].arr[0]
segmentTree[si].arr[1] = segmentTree[2*si].arr[1] + segmentTree[2*si+1].arr[1]
segmentTree[si].arr[2] = segmentTree[2*si].arr[2] + segmentTree[2*si+1].arr[2]
return
def query(si,ss,se,qs,qe):
if lazy[si]!=0:
dx = lazy[si]
lazy[si]=0
segmentTree[si].arr.rotate(dx)
if ss!=se:
lazy[2*si]+=1
lazy[2*si+1]+=1
if qe<ss or qs>se:
return 0
if ss>=qs and se<=qe:
return segmentTree[si].arr[0]
mid = (ss+se)//2
l = query(2*si,ss,mid,qs,qe)
r = query(2*si+1,mid+1,se,qs,qe)
return l+r
def update(si,ss,se,qs,qe):
if lazy[si]!=0:
dx = lazy[si]
lazy[si]=0
segmentTree[si].arr.rotate(dx)
if ss!=se:
lazy[2*si]+=dx
lazy[2*si+1]+=dx
return
if qe<ss or se<qs:
return
if ss>=qs and se<=qe:
segmentTree[si].arr.rotate()
if ss!=se:
lazy[2*si]+=1
lazy[2*si+1]+=1
return
mid = (ss+se)//2
update(2*si,ss,mid,qs,qe)
update(2*si+1,mid+1,se,qs,qe)
segmentTree[si].arr[0] = segmentTree[2*si].arr[0]+segmentTree[2*si+1].arr[0]
segmentTree[si].arr[1] = segmentTree[2*si].arr[1]+segmentTree[2*si+1].arr[1]
segmentTree[si].arr[2] = segmentTree[2*si].arr[2]+segmentTree[2*si+1].arr[2]
return
n,tc = map(int,input().split())
segmentTree = [node() for _ in range(4*n)]
lazy = [0]*(4*n)
buildTree(1,0,n-1)
for _ in range(tc):
q,L,R = map(int,input().split())
if q==0:
update(1,0,n-1,L,R)
else:
print(query(1,0,n-1,L,R))
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKY2xhc3Mgbm9kZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmFyciA9IGRlcXVlKFswLDAsMF0pCgpkZWYgYnVpbGRUcmVlKHNpLHNzLHNlKToKICAgIGlmIHNzID09IHNlOgogICAgICAgIHNlZ21lbnRUcmVlW3NpXS5hcnJbMF09MQogICAgICAgIHNlZ21lbnRUcmVlW3NpXS5hcnJbMV09MAogICAgICAgIHNlZ21lbnRUcmVlW3NpXS5hcnJbMl09MAogICAgICAgIHJldHVybgogICAgbWlkID0gKHNzK3NlKS8vMgogICAgYnVpbGRUcmVlKDIqc2ksc3MsbWlkKQogICAgYnVpbGRUcmVlKDIqc2krMSxtaWQrMSxzZSkKCiAgICBzZWdtZW50VHJlZVtzaV0uYXJyWzBdID0gc2VnbWVudFRyZWVbMipzaV0uYXJyWzBdICsgc2VnbWVudFRyZWVbMipzaSsxXS5hcnJbMF0KICAgIHNlZ21lbnRUcmVlW3NpXS5hcnJbMV0gPSBzZWdtZW50VHJlZVsyKnNpXS5hcnJbMV0gKyBzZWdtZW50VHJlZVsyKnNpKzFdLmFyclsxXQogICAgc2VnbWVudFRyZWVbc2ldLmFyclsyXSA9IHNlZ21lbnRUcmVlWzIqc2ldLmFyclsyXSArIHNlZ21lbnRUcmVlWzIqc2krMV0uYXJyWzJdCiAgICByZXR1cm4KCmRlZiBxdWVyeShzaSxzcyxzZSxxcyxxZSk6CiAgICBpZiBsYXp5W3NpXSE9MDoKICAgICAgICBkeCA9IGxhenlbc2ldCiAgICAgICAgbGF6eVtzaV09MAogICAgICAgIHNlZ21lbnRUcmVlW3NpXS5hcnIucm90YXRlKGR4KQogICAgICAgIGlmIHNzIT1zZToKICAgICAgICAgICAgbGF6eVsyKnNpXSs9MQogICAgICAgICAgICBsYXp5WzIqc2krMV0rPTEKCiAgICBpZiBxZTxzcyBvciBxcz5zZToKICAgICAgICByZXR1cm4gMAogICAgaWYgc3M+PXFzIGFuZCBzZTw9cWU6CiAgICAgICAgcmV0dXJuIHNlZ21lbnRUcmVlW3NpXS5hcnJbMF0KICAgIG1pZCA9IChzcytzZSkvLzIKICAgIGwgPSBxdWVyeSgyKnNpLHNzLG1pZCxxcyxxZSkKICAgIHIgPSBxdWVyeSgyKnNpKzEsbWlkKzEsc2UscXMscWUpCiAgICByZXR1cm4gbCtyCgpkZWYgdXBkYXRlKHNpLHNzLHNlLHFzLHFlKToKICAgIGlmIGxhenlbc2ldIT0wOgogICAgICAgIGR4ID0gbGF6eVtzaV0KICAgICAgICBsYXp5W3NpXT0wCiAgICAgICAgc2VnbWVudFRyZWVbc2ldLmFyci5yb3RhdGUoZHgpCiAgICAgICAgaWYgc3MhPXNlOgogICAgICAgICAgICBsYXp5WzIqc2ldKz1keAogICAgICAgICAgICBsYXp5WzIqc2krMV0rPWR4CiAgICAgICAgcmV0dXJuCiAgICBpZiBxZTxzcyBvciBzZTxxczoKICAgICAgICByZXR1cm4KICAgIGlmIHNzPj1xcyBhbmQgc2U8PXFlOgogICAgICAgIHNlZ21lbnRUcmVlW3NpXS5hcnIucm90YXRlKCkKICAgICAgICBpZiBzcyE9c2U6CiAgICAgICAgICAgIGxhenlbMipzaV0rPTEKICAgICAgICAgICAgbGF6eVsyKnNpKzFdKz0xCiAgICAgICAgcmV0dXJuCiAgICBtaWQgPSAoc3Mrc2UpLy8yCiAgICB1cGRhdGUoMipzaSxzcyxtaWQscXMscWUpCiAgICB1cGRhdGUoMipzaSsxLG1pZCsxLHNlLHFzLHFlKQoKICAgIHNlZ21lbnRUcmVlW3NpXS5hcnJbMF0gPSBzZWdtZW50VHJlZVsyKnNpXS5hcnJbMF0rc2VnbWVudFRyZWVbMipzaSsxXS5hcnJbMF0KICAgIHNlZ21lbnRUcmVlW3NpXS5hcnJbMV0gPSBzZWdtZW50VHJlZVsyKnNpXS5hcnJbMV0rc2VnbWVudFRyZWVbMipzaSsxXS5hcnJbMV0KICAgIHNlZ21lbnRUcmVlW3NpXS5hcnJbMl0gPSBzZWdtZW50VHJlZVsyKnNpXS5hcnJbMl0rc2VnbWVudFRyZWVbMipzaSsxXS5hcnJbMl0KICAgIHJldHVybgogICAgCgpuLHRjID0gbWFwKGludCxpbnB1dCgpLnNwbGl0KCkpCnNlZ21lbnRUcmVlID0gW25vZGUoKSBmb3IgXyBpbiByYW5nZSg0Km4pXQpsYXp5ID0gWzBdKig0Km4pCmJ1aWxkVHJlZSgxLDAsbi0xKQoKZm9yIF8gaW4gcmFuZ2UodGMpOgogICAgcSxMLFIgPSBtYXAoaW50LGlucHV0KCkuc3BsaXQoKSkKICAgIGlmIHE9PTA6CiAgICAgICAgdXBkYXRlKDEsMCxuLTEsTCxSKQogICAgZWxzZToKICAgICAgICBwcmludChxdWVyeSgxLDAsbi0xLEwsUikpCg==