#include<bits/stdc++.h>
#define ll long long
const int N=1e5+5;
int n,q,a[N],diff[N];
template<typename _Tp> _Tp min(_Tp a,_Tp b,_Tp c) {_Tp &tmp=a<b?a:b; return tmp<c?tmp:c;}
struct node {
int L,R,lval,rval,lazy,s[4];//[l,r],[l,r),(l,r],(l,r)
node operator+ (node x) {
node ans;
ans.lval=lval,ans.rval=x.rval;
ans.s[0]=min(s[0]+x.s[0]-(rval==x.lval),s[1]+x.s[0],s[0]+x.s[2]);
ans.s[1]=min(s[0]+x.s[1]-(rval==x.lval),s[1]+x.s[1],s[0]+x.s[3]);
ans.s[2]=min(s[2]+x.s[0]-(rval==x.lval),s[3]+x.s[0],s[2]+x.s[2]);
ans.s[3]=min(s[2]+x.s[1]-(rval==x.lval),s[3]+x.s[1],s[2]+x.s[3]);
return ans;
}
};
class segment_tree {
#define ls (x<<1)
#define rs (x<<1|1)
node nd[N*4];
inline void pushup(int x) {nd[x]=nd[ls]+nd[rs];}
inline void pushdown(int x) {
if(!nd[x].lazy) return;
nd[ls].lazy+=nd[x].lazy,nd[rs].lazy+=nd[x].lazy;
nd[ls].lval+=nd[x].lazy,nd[ls].rval+=nd[x].lazy;
nd[rs].lval+=nd[x].lazy,nd[rs].rval+=nd[x].lazy;
nd[x].lazy=0;
}
public:
segment_tree(int n) {build(1,n);}
inline void build(int l,int r,const int x=1) {
nd[x].L=l,nd[x].R=r;
if(l==r) {nd[x].lval=nd[x].rval=diff[l],nd[x].s[0]=nd[x].s[1]=nd[x].s[2]=1,nd[x].s[3]=0; return;}
int mid=(l+r)>>1;
build(l,mid,ls),build(mid+1,r,rs);
pushup(x);
}
inline void change(int l,int r,int k,const int x=1) {
if(l==nd[x].L && r==nd[x].R) {nd[x].lazy+=k,nd[x].lval+=k,nd[x].rval+=k; return;}
int mid=(nd[x].L+nd[x].R)>>1; pushdown(x);
if(r<=mid) change(l,r,k,ls);
else if(l>=mid+1) change(l,r,k,rs);
else change(l,mid,k,ls),change(mid+1,r,k,rs);
pushup(x);
}
inline node query(int l,int r,const int x=1) {
if(l==nd[x].L && r==nd[x].R) {return nd[x];}
int mid=(nd[x].L+nd[x].R)>>1; pushdown(x);
if(r<=mid) return query(l,r,ls);
else if(l>=mid+1) return query(l,r,rs);
else return query(l,mid,ls)+query(mid+1,r,rs);
}
};
int main() {
// std::ios::sync_with_stdio(0);
// std::cin.tie(0);std::cout.tie(0);
std::cin>>n;
segment_tree sgt {n};
for(int i=1;i<=n;++i) std::cin>>a[i];
for(int i=1;i<=n;++i) diff[i]=a[i]-a[i-1];
std::cin>>q;
while(q--) {
char opt;
std::cin>>opt;
if(opt=='A') {
int s,t,a,b;
std::cin>>s>>t>>a>>b;
sgt.change(s,s,a),sgt.change(s+1,t,b);
}
else {
int s,t;
std::cin>>s>>t;
node ans=sgt.query(s,t);
std::cout<<ans.s[2]<<'\n';
}
}
return 0;
}
好像编译完就RE了,都没来得及读数据,怎么回事呢