#include #define INF 100000009 #define mod 1000000007 #define PI 3.14159 #define vi vector #define ll long long #define ii pair #define vii vector #define pb push_back #define mp make_pair #define fs first #define sc second #define mt make_tuple #define eb emplace_back #define CLR(arr) memset(arr, 0, sizeof(arr)) #define FAST_IO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0) using namespace std; static int a[100005]; ll mod_exp(ll base, ll exp, ll m) { ll ans = 1; base = base%m; while(exp) { if(exp&1) ans = (ans*base)%m; base = (base*base)%m; exp>>=1; } return ans; } struct node { vi sum; // segment sum int l,r; // segment rang : [l,r] bool update_pending ; int add_upd; node() { add_upd=l=r=0; sum = vi(26, 0); update_pending = false; } void update(node* &tree, int ind) { vi sum_tmp = sum; for(int i=0; i<26; ++i) sum[i] = sum_tmp[(i-add_upd+26)%26]; if(l!=r) // Update Lazy Statistics for children { if(tree[2*ind+1].update_pending == true) { tree[2*ind+1].add_upd = (tree[2*ind+1].add_upd + add_upd)%26; } else { tree[2*ind+1].add_upd = add_upd; tree[2*ind+1].update_pending = true; } if(tree[2*ind+2].update_pending == true) { tree[2*ind+2].add_upd = (tree[2*ind+2].add_upd + add_upd)%26; } else { tree[2*ind+2].add_upd = add_upd; tree[2*ind+2].update_pending = true; } } add_upd = 0; update_pending = false; } }; vi sum_node(vi x, vi y) { vi s(26, 0); for(int i=0; i<26; ++i) s[i] = x[i] + y[i]; return s; } class SEGTREE { private: node *tree; int size; public: SEGTREE(int n) { size=1; while(size < n) size<<=1; size<<=1; tree = new node[size+1]; size-=1; build_tree(0,n-1,0); } vi build_tree(int l,int r,int ind) { if(l==r) { tree[ind].l = tree[ind].r = l; tree[ind].sum[a[l]] = 1; return ( tree[ind].sum); } tree[ind].l = l; tree[ind].r = r; int mid = l +(r-l)/2; return tree[ind].sum = sum_node(build_tree(l,mid,2*ind+1) ,build_tree(mid+1,r,2*ind+2) ); } vi getsum(int l, int r, int sl, int sr, int ind) // Query Range : [l,r] { // Node range : [sl,sr] if(tree[ind].update_pending == true) // Node's index : ind tree[ind].update(tree,ind); if(l<=sl && sr<=r) return tree[ind].sum; if(l>sr || rsr || r>n>>q; for(i=0 ; i>ch; if(ch==1) { scanf("%d %d %lld", &x, &y, &v); v = v%26; ST.add(x,y,0,n-1,0,v); } else if(ch==2) { scanf("%d %d", &x, &y); vi sum = ST.getsum(x,y,0,n-1,0); ll ans = 1; ll tp = 0; for(int i=0; i<26; ++i) { if(sum[i]==0) continue; ll tmp = mod_exp(2, sum[i]-1, mod); ans = (ans*tmp)%mod; tp++; } ans = ((ans)*(1+tp) -1 + mod)%mod; cout<