#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdbool.h>
#include <math.h>
#define ll long long int
#define MAX 100000+10
#define ull unsigned long long int
#define gcd(a,b)    __gcd(a,b)

using namespace std;

struct info
{
    int zero,one,two,lazy;
} tree[MAX*5];

void update_lazy(int node)
{
    int temp = tree[node].zero;
    tree[node].zero = tree[node].two;
    tree[node].two = tree[node].one;
    tree[node].one = temp;
}

void update_node(int node,int left)
{
    tree[left].lazy +=  tree[node].lazy;
    tree[left+1].lazy +=  tree[node].lazy;

    tree[node].lazy%=3;
    int shift = tree[node].lazy;
    while(shift--)
    {
        update_lazy(left);
        update_lazy(left+1);
    }
    tree[node].lazy=0;
}

void marge(int node, int left, int right)
{
    tree[node].zero= tree[left].zero + tree[right].zero;
    tree[node].one= tree[left].one + tree[right].one;
    tree[node].two= tree[left].two + tree[right].two;
}

void build(int node, int b, int e)
{
    if (b == e)
    {
        tree[node].one = 0;
        tree[node].two = 0;
        tree[node].lazy = 0;
        tree[node].zero = 1;

        return;
    }
    int Left = node * 2;
    int Right = node * 2 + 1;
    int mid = (b + e) / 2;
    build(Left, b, mid);
    build(Right, mid + 1, e);

    marge(node,Left,Right);

}

void update(int node, int l, int r, int i, int j)
{
    //cout<<node<<" "<<l<<" "<<r<<" "<<i<<" "<<j<<endl;
    int Left = node*2;
    if(tree[node].lazy!=0){
        update_node(node,Left);
    }
    //no overlap
    if(l>r || l>j || r<i) return;

    //total overlap
    if(l>=i && r<=j){
        tree[node].lazy++;
        update_lazy(node);
        return;
    }
    //partial overlap
    int mid = (l+r)/2;
    update(Left,l,mid,i,j);
    update(Left+1,mid+1,r,i,j);

    marge(node,Left,Left+1);

}

int query(int node,int l,int r,int i,int j)
{
    if(l>r || l>j || r<i) return 0;
    if(tree[node].lazy!=0){
    	
    	update_node(node,node*2);
    }
    if(l>=i && r<=j) return tree[node].zero;
    int mid = (l+r)/2;
    int Left = node*2;
    return query(Left,l,mid,i,j) + query(Left+1,mid+1,r,i,j);
}

int main()
{
    int t,no=0;
    // scanf("%d",&t);

    // while(t--)
    {
        int n,q,a;
        scanf("%d %d",&n,&q);

        memset(tree,0,sizeof(tree));
        build(1,1,n);

        printf("Case %d:\n",++no);
        while(q--)
        {
            int type,l,r;
            scanf("%d %d %d",&type,&l,&r);
            l++;
            r++;

            if(type == 0)
            {
                update(1,1,n,l,r);
            }
            else
            {
                printf("%d\n",query(1,1,n,l,r));
            }
        }
    }

    return 0;
}
