区间加法,区间查询
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
typedef long long ll;
struct tree{
int l,r;
ll sum,lz;
}t[N << 2];
void push_up(int i){
t[i].sum = t[i << 1].sum + t[i << 1 | 1].sum;
}
void push_down(int i){
if(t[i].lz){
t[i << 1].lz += t[i].lz;
t[i << 1 | 1].lz += t[i].lz;
t[i << 1].sum += t[i].lz * (t[i << 1].r - t[i << 1].l + 1);
t[i << 1 | 1].sum += t[i].lz * (t[i << 1 | 1].r - t[i << 1 | 1].l + 1);
t[i].lz = 0;
}
}
void build(int i,int l,int r){
t[i].l = l,t[i].r = r;
t[i].lz = 0;
if(l == r){
scanf("%lld",&t[i].sum);
return;
}
int m = l + r >> 1;
build(i << 1,l,m);
build(i << 1 | 1,m + 1,r);
push_up(i);
}
void modify(int i,int l,int r,int k){
if(t[i].l >= l && t[i].r <= r){
t[i].lz += k;
t[i].sum += k * (t[i].r - t[i].l + 1);
return;
}
push_down(i);
if(t[i << 1].r >= l) modify(i << 1,l,r,k);
if(t[i << 1 | 1].l <= r) modify(i << 1 | 1,l,r,k);
push_up(i);
}
ll query(int i,int l,int r){
if(t[i].l >= l && t[i].r <= r){
return t[i].sum;
}
push_down(i);
ll s = 0;
if(t[i << 1].r >= l) s += query(i << 1,l,r);
if(t[i << 1 | 1].l <= r) s += query(i << 1 | 1,l,r);
return s;
}
int main(){
return 0;
}
区间乘法与加法结合(先乘后加)
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n,m,mod;
struct tree{
int l,r;
int sum;
int mlz,alz;
}t[N << 2];
void push_up(int i){
t[i].sum = t[i << 1].sum + t[i << 1 | 1].sum;
}
void push_down(int i){
int alz = t[i].alz,mlz = t[i].mlz;
t[i << 1].sum = (mlz * t[i << 1].sum + (t[i << 1].r - t[i << 1].l + 1) * alz % mod) % mod;
t[i << 1 | 1].sum = (mlz * t[i << 1 | 1].sum + (t[i << 1 | 1].r - t[i << 1 | 1].l + 1) * alz % mod ) % mod;
t[i << 1].alz = (t[i << 1].alz * mlz + alz) % mod;
t[i << 1 | 1].alz = (t[i << 1 | 1].alz * mlz + alz) % mod;
t[i << 1].mlz = t[i << 1].mlz * mlz % mod;
t[i << 1 | 1].mlz = t[i << 1 | 1].mlz * mlz % mod;
t[i].alz = 0;
t[i].mlz = 1;
}
void build(int i,int l,int r){
t[i].l = l,t[i].r = r;
t[i].alz = 0,t[i].mlz = 1;
if(l == r){
int tmp;
scanf("%d",tmp);
t[i].sum = tmp % mod;
return;
}
int mid = l + r >> 1;
build(i << 1,l,mid);
build(i << 1 | 1,mid + 1,r);
push_up(i);
}
void add(int i,int l,int r,int k){
if(t[i].l >= l && t[i].r <= r){
t[i].alz = (t[i].alz + k) % mod;
t[i].sum = (t[i].sum + k * (t[i].r - t[i].l + 1)) % mod;
return;
}
push_down(i);
if(t[i << 1].r >= l) add(i << 1,l,r,k);
if(t[i << 1 | 1].l <= r) add(i << 1 | 1,l,r,k);
push_up(i);
}
void mul(int i,int l,int r,int k){
if(t[i].l >= l && t[i].r <= r){
t[i].alz = t[i].alz * k % mod;
t[i].mlz = t[i].mlz * k % mod;
t[i].sum = t[i].sum * k % mod;
return;
}
push_down(i);
if(t[i << 1].r >= l) mul(i << 1,l,r,k);
if(t[i << 1 | 1].l <= r) mul(i << 1 | 1,l,r,k);
push_up(i);
}
int query(int i,int l,int r){
if(t[i].l >= l && t[i].r <= r){
return t[i].sum;
}
push_down(i);
int s = 0;
if(t[i << 1].r >= l) s = (s + query(i << 1,l,r)) % mod;
if(t[i << 1 | 1].l <= r) s = (s + query(i << 1 | 1,l,r)) % mod;
return s;
}
int main(){
scanf("%d%d%d",&n,&m,&mod);
return 0;
}