显示代码纯文本
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 10005, mod = 998244353;
int N, M, B;
int b[maxn], c[maxn], d[maxn];
int fib[maxn];
void Insert(int l, int r) {
int bl = b[l], br = b[r];
if (bl == br) {
for (int i=l; i<=r; ++i)
c[i] += fib[i-l+1], c[i] %= mod;
return;
}
for (int i=l; b[i]==bl; ++i)
c[i] += fib[i-l+1], c[i] %= mod;
for (int i=r; b[i]==br; --i)
c[i] += fib[i-l+1], c[i] %= mod;
for (int i=bl+1; i<br; ++i) {
int p = (i-1)*B+1;
d[p] += fib[p-l+1], d[p] %= mod;
++p;
d[p] += fib[p-l+1], d[p] %= mod;
}
}
int Query(int p){
int c1 = (b[p]-1)*B+1, c2 = c1+1;
if(p==c1) return d[p]+c[p];
while(c2!=p) {
d[c2+1] = d[c1]+d[c2];
d[c2+1] %= mod;
++c1, ++c2;
}
return d[p]+c[p];
}
int main(){
freopen("chenyao_fib_game.in", "r", stdin);
freopen("chenyao_fib_game.out", "w", stdout);
scanf("%d%d", &N, &M);
fib[1] = fib[2] = 1;
for (int i=3; i<=N; ++i)
fib[i] = fib[i-1]+fib[i-2], fib[i] %= mod;
B = (int)sqrt(N);
for (int i=1; i<=N; ++i) b[i] = (i-1)/B+1;
for (int i=1,op,a,b; i<=M; ++i) {
scanf("%d", &op);
if (op==1) scanf("%d%d", &a, &b), Insert(a, b);
else scanf("%d", &a), printf("%d\n", Query(a)%mod);
}
return 0;
}