#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 9;
const int maxN = 3e5 + 10;
int n, m;
int a[maxN], fibo[maxN], st[4 * maxN];
pair <int, int> lazy[4 * maxN];
void add(int &x, int y) {
x += y;
if (x > mod) x -= mod;
}
void build(int id, int l, int r) {
if (l == r) {
st[id] = a[l];
return;
}
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
st[id] = (st[id << 1] + st[id << 1 | 1]) % mod;
}
void fix(int id, int l, int r) {
if (!lazy[id].first && !lazy[id].second) return;
long long a = lazy[id].first;
long long b = lazy[id].second;
int tmp = (r - l + 1) + 2;
add(st[id], (b * fibo[tmp - 1] + a * fibo[tmp - 2] - b) % mod);
if (l != r) {
int mid = (r - l) >> 1;
add(lazy[id << 1].first , lazy[id].first);
add(lazy[id << 1].second, lazy[id].second);
add(lazy[id << 1 | 1].first , (b * fibo[mid + 1] + a * fibo[mid]) % mod);
add(lazy[id << 1 | 1].second, (b * fibo[mid + 2] + a * fibo[mid + 1]) % mod);
}
lazy[id] = {0, 0};
}
void update(int id, int l, int r, int u, int v) {
fix(id, l, r);
if (l > v || r < u) return;
if (l >= u && r <= v) {
int tmp = l - u + 1;
add(lazy[id].first , fibo[tmp]);
add(lazy[id].second, fibo[tmp + 1]);
fix(id, l, r);
return;
}
int mid = (l + r) >> 1;
update(id << 1, l, mid, u, v);
update(id << 1 | 1, mid + 1, r, u, v);
st[id] = (st[id << 1] + st[id << 1 | 1]) % mod;
}
int get(int id, int l, int r, int u, int v) {
fix(id, l, r);
if (l > v || r < u) return 0;
if (l >= u && r <= v) return st[id];
int mid = (l + r) >> 1;
int g1 = get(id << 1, l, mid, u, v);
int g2 = get(id << 1 | 1, mid + 1, r, u, v);
return (g1 + g2) % mod;
}
main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> a[i];
build(1, 1, n);
fibo[1] = fibo[2] = 1;
for (int i = 3; i <= n + 2; ++i)
fibo[i] = (fibo[i - 1] + fibo[i - 2]) % mod;
while (m--) {
int t, l, r;
cin >> t >> l >> r;
if (t == 1) update(1, 1, n, l, r);
else cout << get(1, 1, n, l, r) << '\n';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIApjb25zdCBpbnQgbW9kICA9IDFlOSArIDk7CmNvbnN0IGludCBtYXhOID0gM2U1ICsgMTA7CiAKaW50IG4sIG07CmludCBhW21heE5dLCBmaWJvW21heE5dLCBzdFs0ICogbWF4Tl07CnBhaXIgPGludCwgaW50PiBsYXp5WzQgKiBtYXhOXTsKIAp2b2lkIGFkZChpbnQgJngsIGludCB5KSB7CiAgICB4ICs9IHk7CiAgICBpZiAoeCA+IG1vZCkgeCAtPSBtb2Q7Cn0KCnZvaWQgYnVpbGQoaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmIChsID09IHIpIHsKICAgICAgICBzdFtpZF0gPSBhW2xdOyAKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgYnVpbGQoaWQgPDwgMSwgbCwgbWlkKTsKICAgIGJ1aWxkKGlkIDw8IDEgfCAxLCBtaWQgKyAxLCByKTsKICAgIHN0W2lkXSA9IChzdFtpZCA8PCAxXSArIHN0W2lkIDw8IDEgfCAxXSkgJSBtb2Q7Cn0KIAp2b2lkIGZpeChpbnQgaWQsIGludCBsLCBpbnQgcikgewogICAgaWYgKCFsYXp5W2lkXS5maXJzdCAmJiAhbGF6eVtpZF0uc2Vjb25kKSByZXR1cm47CiAKICAgIGxvbmcgbG9uZyBhID0gbGF6eVtpZF0uZmlyc3Q7CiAgICBsb25nIGxvbmcgYiA9IGxhenlbaWRdLnNlY29uZDsKICAgIGludCB0bXAgPSAociAtIGwgKyAxKSArIDI7CiAgICBhZGQoc3RbaWRdLCAoYiAqIGZpYm9bdG1wIC0gMV0gKyBhICogZmlib1t0bXAgLSAyXSAtIGIpICUgbW9kKTsKIAogICAgaWYgKGwgIT0gcikgewogICAgICAgIGludCBtaWQgPSAociAtIGwpID4+IDE7CiAgICAgICAgYWRkKGxhenlbaWQgPDwgMV0uZmlyc3QgLCBsYXp5W2lkXS5maXJzdCk7CiAgICAgICAgYWRkKGxhenlbaWQgPDwgMV0uc2Vjb25kLCBsYXp5W2lkXS5zZWNvbmQpOwogICAgICAgIGFkZChsYXp5W2lkIDw8IDEgfCAxXS5maXJzdCAsIChiICogZmlib1ttaWQgKyAxXSArIGEgKiBmaWJvW21pZF0pICUgbW9kKTsKICAgICAgICBhZGQobGF6eVtpZCA8PCAxIHwgMV0uc2Vjb25kLCAoYiAqIGZpYm9bbWlkICsgMl0gKyBhICogZmlib1ttaWQgKyAxXSkgJSBtb2QpOwogICAgfQogICAgbGF6eVtpZF0gPSB7MCwgMH07Cn0KIAp2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CiAgICBmaXgoaWQsIGwsIHIpOwogICAgaWYgKGwgPiAgdiB8fCByIDwgIHUpIHJldHVybjsKICAgIGlmIChsID49IHUgJiYgciA8PSB2KSB7CiAgICAgICAgaW50IHRtcCA9IGwgLSB1ICsgMTsKICAgICAgICBhZGQobGF6eVtpZF0uZmlyc3QgLCBmaWJvW3RtcF0pOwogICAgICAgIGFkZChsYXp5W2lkXS5zZWNvbmQsIGZpYm9bdG1wICsgMV0pOwogICAgICAgIGZpeChpZCwgbCwgcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIHVwZGF0ZShpZCA8PCAxLCBsLCBtaWQsIHUsIHYpOwogICAgdXBkYXRlKGlkIDw8IDEgfCAxLCBtaWQgKyAxLCByLCB1LCB2KTsKICAgIHN0W2lkXSA9IChzdFtpZCA8PCAxXSArIHN0W2lkIDw8IDEgfCAxXSkgJSBtb2Q7Cn0KIAppbnQgZ2V0KGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpIHsKICAgIGZpeChpZCwgbCwgcik7CiAgICBpZiAobCA+ICB2IHx8IHIgPCAgdSkgcmV0dXJuIDA7CiAgICBpZiAobCA+PSB1ICYmIHIgPD0gdikgcmV0dXJuIHN0W2lkXTsKIAogICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgIGludCBnMSA9IGdldChpZCA8PCAxLCBsLCBtaWQsIHUsIHYpOwogICAgaW50IGcyID0gZ2V0KGlkIDw8IDEgfCAxLCBtaWQgKyAxLCByLCB1LCB2KTsKICAgIHJldHVybiAoZzEgKyBnMikgJSBtb2Q7Cn0KIAptYWluKCkgewogICAgY2luID4+IG4gPj4gbTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgY2luID4+IGFbaV07CiAgICBidWlsZCgxLCAxLCBuKTsKIAogICAgZmlib1sxXSA9IGZpYm9bMl0gPSAxOwogICAgZm9yIChpbnQgaSA9IDM7IGkgPD0gbiArIDI7ICsraSkgCiAgICAgICAgZmlib1tpXSA9IChmaWJvW2kgLSAxXSArIGZpYm9baSAtIDJdKSAlIG1vZDsKIAogICAgd2hpbGUgKG0tLSkgewogICAgICAgIGludCB0LCBsLCByOyAKICAgICAgICBjaW4gPj4gdCA+PiBsID4+IHI7IAogICAgICAgIGlmICh0ID09IDEpIHVwZGF0ZSgxLCAxLCBuLCBsLCByKTsKICAgICAgICBlbHNlIGNvdXQgPDwgZ2V0KDEsIDEsIG4sIGwsIHIpIDw8ICdcbic7CiAgICB9Cn0=