| 12
 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
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 
 | #include<bits/stdc++.h>using namespace std;
 
 #define ml ((l+r)>>1)
 #define mr (ml+1)
 
 const int maxn=1e5+5;
 int ls[maxn<<1],rs[maxn<<1],rev[maxn<<1],mx[maxn<<1],mi[maxn<<1],a[maxn],tot;
 void pushup(int&u){
 mx[u]=max(mx[ls[u]],mx[rs[u]]);
 mi[u]=min(mi[ls[u]],mi[rs[u]]);
 }
 void pushdown(int&u){
 if(rev[u]){
 swap(mx[ls[u]],mi[ls[u]]);
 mx[ls[u]]=1e5-mx[ls[u]];
 mi[ls[u]]=1e5-mi[ls[u]];
 rev[ls[u]]^=1;
 
 swap(mx[rs[u]],mi[rs[u]]);
 mx[rs[u]]=1e5-mx[rs[u]];
 mi[rs[u]]=1e5-mi[rs[u]];
 rev[rs[u]]^=1;
 
 rev[u]=0;
 }
 }
 void build(int&u,int l,int r){
 u=++tot;
 rev[u]=0;
 if(l==r){mx[u]=mi[u]=a[l];return;}
 build(ls[u],l,ml); build(rs[u],mr,r);
 pushup(u);
 }
 void update1(int&u,int l,int r,int q,int d){
 if(l==r){mx[u]=mi[u]=d;return;}
 pushdown(u);
 if(q<=ml)update1(ls[u],l,ml,q,d);
 if(q>=mr)update1(rs[u],mr,r,q,d);
 pushup(u);
 }
 void update2(int&u,int l,int r,int ql,int qr){
 if(ql<=l&&r<=qr){
 rev[u]^=1;
 swap(mx[u],mi[u]); mx[u]=1e5-mx[u]; mi[u]=1e5-mi[u];
 return;
 }
 pushdown(u);
 if(ql<=ml) update2(ls[u],l,ml,ql,qr);
 if(mr<=qr) update2(rs[u],mr,r,ql,qr);
 pushup(u);
 }
 int A,B,C;
 long long f(int x,int y){return 1ll*x*A+1ll*y*B+1ll*x*y*C;}
 
 long long query(int&u,int l,int r,int ql,int qr){
 if(mx[u]==mi[u]) return f(r,mx[u]);
 pushdown(u);
 if(qr<=ml) return query(ls[u],l,ml,ql,qr);
 else if(ql>=mr) return query(rs[u],mr,r,ql,qr);
 else {
 long long f1=f(ml,mx[ls[u]]),f2=f(r,mx[rs[u]]);
 long long res=0;
 if(f1>f2){
 res=query(ls[u],l,ml,ql,qr);
 if(f2>res) res=max(res,query(rs[u],mr,r,ql,qr));
 }
 else{
 res=query(rs[u],mr,r,ql,qr);
 if(f1>res) res=max(res,query(ls[u],l,ml,ql,qr));
 }
 return res;
 }
 }
 
 
 int x;
 int read(){
 x=(100000005ll*x+20150609)%998244353;
 return x/100;
 }
 
 int main(){
 int n,m;
 scanf("%d%d%d",&n,&m,&x);
 for(int i=1;i<=n;i++) a[i]=read()%100001;
 char s[10];
 int rt; build(rt,1,n);
 while(m--){
 scanf("%s",s);
 if(s[0]=='C'){
 int p=read()%n+1;
 int y=read()%100001;
 update1(rt,1,n,p,y);
 }
 else if(s[0]=='R'){
 int p=read()%n+1;
 int q=read()%n+1;
 if(p>q) swap(p,q);
 update2(rt,1,n,p,q);
 }
 else{
 scanf("%d%d%d",&A,&B,&C);
 int p=read()%n+1;
 int q=read()%n+1;
 if(p>q) swap(p,q);
 printf("%lld\n",query(rt,1,n,p,q));
 }
 }
 }
 
 
 |