C++线段树模版代码
#include<bits/stdc++.h>
#define int long long
#define ls 2*root
#define rs 2*root+1
using namespace std;
const int MAXN = 1e5+10;
int he[5 * MAXN], biao[5 * MAXN], a[5 * MAXN];
void pushup(int root){
he[root] = he[rs]+he[ls];
}
void build(int root, int l, int r){
biao[root]=0;
if(l == r) {
he[root]=a[l];
return ;
}
int mid = (l + r) / 2;
build(ls, l, mid);
build(rs, mid+1, r);
pushup(root);
}
void pushdown(int root,int l,int r){
int mid=(l+r)/2;
biao[ls]+=biao[root];
he[ls]+=biao[root]*(mid-l+1);
biao[rs]+=biao[root];
he[rs]+=biao[root]*(r-mid);
biao[root]=0;
}
void update(int root, int l, int r,int ql,int qr,int k){
if(ql<=l&&r<=qr){
he[root]+=k*(r-l+1);
biao[root]+=k;
return ;
}
pushdown(root,l,r);
int mid=(l+r)/2;
if(ql<=mid)update(ls,l,mid,ql,qr,k);
if(qr>mid) update(rs,mid+1,r,ql,qr,k);
pushup(root);
}
int query(int root, int l, int r, int qx, int qy){
int ans = 0;
if (qx <= l && r <= qy) return he[root];
int mid=(l+r)/2;
pushdown(root,l,r);
if (qx <= mid) ans += query(ls, l, mid, qx, qy);
if (qy > mid) ans += query(rs, mid+1, r, qx, qy);
return ans;
}
signed main(){
int n,m;
cin >> n >> m;
for(int i = 1;i<=n;i++){
cin >>a[i];
}
build(1,1,n);
while(m--){
char op;
int a, b,k;
cin >> op >> a >> b;
if(a>b)swap(a,b);
if(op == '1'){
cin >> k;
update(1, 1, n, a, b, k);
}else if(op == '2'){
cout << query(1, 1, n, a, b)<<'\n';
}
}
return 0;
}
#include<bits/stdc++.h>
#define ls 2*root
#define rs 2*root+1
using namespace std;
const int MAXN = 3e5+10;
int he[5 * MAXN], biao[5 * MAXN], a[5 * MAXN];
void pushup(int root){
he[root] =( he[rs]+he[ls])%2;
}
void build(int root, int l, int r){
biao[root]=0;
if(l == r) {
he[root]=a[l];
return ;
}
int mid = (l + r) / 2;
build(ls, l, mid);
build(rs, mid+1, r);
pushup(root);
}
void pushdown(int root,int l,int r){
int mid=(l+r)/2;
biao[ls]=(biao[ls]+biao[root])%2;
he[ls]=(he[ls]+(biao[root]*(mid-l+1))) % 2;
biao[rs]=(biao[rs]+biao[root])%2;
he[rs]=(he[rs]+(biao[root]*(r-mid))) % 2;
biao[root]=0;
}
void update(int root, int l, int r,int ql,int qr,int k){
if(ql<=l&&r<=qr){
he[root]=(k*(r-l+1)+he[root])%2;
biao[root]=(k+biao[root])%2;
return ;
}
pushdown(root,l,r);
int mid=(l+r)/2;
if(ql<=mid)update(ls,l,mid,ql,qr,k);
if(qr>mid) update(rs,mid+1,r,ql,qr,k);
pushup(root);
}
int query(int root, int l, int r, int qx, int qy){
int ans = 0;
if (qx <= l && r <= qy) return he[root];
int mid=(l+r)/2;
pushdown(root,l,r);
if (qx <= mid) ans += query(ls, l, mid, qx, qy);
if (qy > mid) ans += query(rs, mid+1, r, qx, qy);
return ans;
}
signed main(){
int n,m;
cin >> n >> m;
string s1,s2;
cin >> s1>>s2;
build(1,1,n);
for(int i = 1;i<=m;i++){
int a, b;
cin>> a>>b;
update(1,1,n,a,b,1);
}
for(int i = 1;i<=n;i++){
int k=query(1,1,n,i,i);
if(k==1){
cout<<s2[i-1];
}else{
cout<<s1[i-1];
}
}
puts("");
return 0;
}