- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #define MOD 1000000009
- using namespace std;
- const int MAXN = 1000100;
- int n, m, a, b, q;
- long long x;
- struct node
- {
- long long val, lazy;
- };
- node tree[4*MAXN];
- void build(int begin, int end, int index)
- {
- if(begin == end)
- {
- tree[index].val = 1;
- tree[index].lazy = 1;
- return;
- }
- int mid = (begin+end)>>1;
- build(begin, mid, index*2);
- build(mid+1, end, index*2+1);
- tree[index].val = tree[index*2].val+tree[index*2+1].val;
- tree[index].lazy = 1;
- }
- long long upd_value;
- void update(int begin, int end, int i, int j, int index, long long xx)
- {
- if(begin >= i and end <= j)
- {
- //printf("%d %d\n", tree[index].val, tree[index].lazy);
- tree[index].lazy = (tree[index].lazy*xx)%MOD;
- tree[index].val = (tree[index].val*tree[index].lazy)%MOD;
- //printf("%d %d\n", tree[index].val, tree[index].lazy);
- return;
- }
- int mid = (begin+end)>>1;
- if(tree[index].lazy > 1)
- {
- tree[index*2].val = (tree[index*2].val*tree[index].lazy)%MOD;
- tree[index*2+1].val = (tree[index*2+1].val*tree[index].lazy)%MOD;
- tree[index].lazy = 1LL;
- }
- if(j <= mid)
- update(begin, mid, i, j, index*2, xx);
- else if(i > mid)
- update(mid+1, end, i, j, index*2+1, xx);
- else
- update(begin, mid, i, mid, index*2, xx), update(mid+1, end, mid+1, j, index*2+1, xx);
- tree[index].val = ((tree[index*2].val%MOD) + (tree[index*2+1].val%MOD))%MOD;
- }
- long long get(int begin, int end, int i, int j, int index)
- {
- if(begin >= i and end <= j)
- return tree[index].val%MOD;
- if(j < begin or i > end) return -1;
- long long p1, p2;
- int mid=(begin+end)>>1;
- if(tree[index].lazy > 1)
- {
- tree[index*2].val = (tree[index*2].val*tree[index].lazy)%MOD;
- tree[index*2+1].val = (tree[index*2+1].val*tree[index].lazy)%MOD;
- tree[index].lazy = 1LL;
- tree[index].val = (tree[index*2].val+tree[index*2+1].val)%MOD;
- }
- p1 = get(begin, mid, i, j, index*2);
- p2 = get(mid+1, end, i, j, index*2+1);
- if(p1 == -1) return p2%MOD;
- if(p2 == -1) return p1%MOD;
- return (p1+p2)%MOD;
- }
- void solve()
- {
- scanf("%d %d", &n, &m);
- build(1, n, 1);
- for(int i = 0; i < m; i++)
- {
- scanf("%d", &q);
- if(q == 1)
- {
- scanf("%d %d", &a, &b);
- long long ans=get(1, n, a, b, 1)%MOD;
- printf("%lld\n", ans);
- }
- else
- {
- scanf("%d %d %lld", &a, &b, &x);
- upd_value = x;
- update(1, n, a, b, 1, x);
- /*for(int i = 1; i <= 25; i++)
- printf("ID %d ; %d\n", i, tree[i]);*/
- }
- }
- }
- int main()
- {
- solve();
- return 0;
- }