CF1634F

令 $C_i=A_i-B_i$

因为加上斐波那契数列,我们定义差分数组 $D_i=C_i-C_{i-1}-C_{i-2}$

如果在区间 $[l,r]$ 上操作,只需要 $D_l+=1,D_{r+1}-=f[r-l+1]-f[r-l],D_{r+2}-=f[r-l+1]$

$A,B$ 相等等价于 $C$ 全为0,区间全为又等价为其差分数组 $D$ 全为 $0$ 。都是充要的。

只需要在更新 $D$ 的时候统计数组中 $0$ 的个数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define maxn 300005
#define put() putchar('\n')
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
using namespace std;
inline void read(int &x){
int f=1;x=0;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
x*=f;
}
namespace Debug{
Tp void _debug(char* f,Ty t){cerr<<f<<'='<<t<<endl;}
Ts void _debug(char* f,Ty x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);}
Tp ostream& operator<<(ostream& os,vector<Ty>& V){os<<"[";for(auto& vv:V) os<<vv<<",";os<<"]";return os;}
#define gdb(...) _debug(#__VA_ARGS__,__VA_ARGS__)
}using namespace Debug;
int n,q,mod;
int d[maxn],f[maxn],a[maxn],b[maxn],num;
inline void add(int now,int x) {
if (now>n) return ;
x=(x%mod+mod)%mod;
num-=(d[now]==0);
d[now]=(d[now]+x)%mod;
num+=(d[now]==0);
}
signed main(void){
// freopen("1.in","r",stdin);
int i,l,r;char ch;
read(n);read(q);read(mod);
for (i=1;i<=n;i++) read(a[i]);
for (i=1;i<=n;i++) read(b[i]),a[i]=(a[i]-b[i]+mod)%mod;
d[1]=a[1];
for (i=2;i<=n;i++) d[i]=(a[i]-a[i-1]-a[i-2]+mod*2)%mod;
for (i=1;i<=n;i++) num+=(d[i]==0);
f[1]=f[2]=1;for (i=3;i<=n;i++) f[i]=(f[i-1]+f[i-2])%mod;
for (i=1;i<=q;i++) {
ch=getchar();while (ch!='A'&&ch!='B') ch=getchar();read(l);read(r);
if (ch=='A') {add(l,1);add(r+1,-f[r-l+1]-f[r-l]+mod*2);add(r+2,-f[r-l+1]+mod);}
else add(l,mod-1),add(r+1,f[r-l+1]+f[r-l]),add(r+2,f[r-l+1]);
puts(num==n?"Yes":"No");
}
return 0;
}