看了半天没看出问题要哭了
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.LinkedList;
import java.util.Queue;
//线段树2
class Xnode{
long val;
long add;//lazy
long mul=1;//lazy
int[] range;
Xnode right;
Xnode left;
}
public class Main {
public static int p;
public static long[] ns;
public static Queue<Long> printQueue = new LinkedList<>();
public static void pushdown(Xnode n){
if(n.right==null&&n.left==null)return;
if(n.mul!=1){
n.right.val*=n.mul;
n.right.mul*=n.mul;
n.right.add*=n.mul;
n.left.val*=n.mul;
n.left.mul*=n.mul;
n.left.add*=n.mul;
n.mul=1;
}
if(n.add!=0){
n.right.val+=n.add*(n.right.range[1]-n.right.range[0]+1);
n.left.val+=n.add*(n.left.range[1]-n.left.range[0]+1);
n.add=0;
}
}
public static void pushup(Xnode n){
if(n.right==null&&n.left==null)return;
n.val=0;
if(n.left!=null)n.val+=n.left.val;
if(n.right!=null)n.val+=n.right.val;
}
public static Xnode build(int begin,int end){
if(begin>end)return null;
Xnode root = new Xnode();
root.range=new int[]{begin,end};
if(begin==end)root.val=ns[begin-1];
else {
int mid=(begin+end)/2;
root.left=build(begin,mid);
root.right=build(mid+1,end);
pushup(root);
}
return root;
}
public static void add(int x,int y,int k,Xnode r){
if(r==null)return;
if(x>r.range[1]||y<r.range[0])return;
if(x<=r.range[0]&&y>=r.range[1]){
r.add+=k;
r.val+=k*(r.range[1]-r.range[0]+1);
}else {
if(r.right!=null)add(x,y,k,r.right);
if(r.left!=null)add(x,y,k,r.left);
pushup(r);
}
}
public static void mul(int x,int y,int k,Xnode r){
if(r==null)return;
if(x>r.range[1]||y<r.range[0])return;
if(x<=r.range[0]&&y>=r.range[1]){
r.add*=k;
r.mul*=k;
r.val*=k;
}else {
if(r.right!=null)mul(x,y,k,r.right);
if(r.left!=null)mul(x,y,k,r.left);
pushup(r);
}
}
public static long getByRange(int x,int y,Xnode r){
if(r==null)return 0;
if(x>r.range[1]||y<r.range[0])return 0;
if(x<=r.range[0]&&y>=r.range[1])return r.val;
pushdown(r);
long l = getByRange(x, y, r.left) + getByRange(x, y, r.right);
return l;
}
public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
st.nextToken();
int n = (int) st.nval;
st.nextToken();
int m = (int) st.nval;
st.nextToken();
p = (int) st.nval;
ns = new long[n];
for (int i = 0; i < n; i++) {
st.nextToken();
ns[i]=(long)st.nval;
}
Xnode root = build(1,n);
int tmp,x,y,k;
for (int i = 0; i < m; i++) {
st.nextToken();
tmp=(int)st.nval;
if (tmp==1) {
st.nextToken();
x=(int)st.nval;
st.nextToken();
y=(int)st.nval;
st.nextToken();
k=(int)st.nval;
mul(x,y,k,root);
} else if (tmp==2) {
st.nextToken();
x=(int)st.nval;
st.nextToken();
y=(int)st.nval;
st.nextToken();
k=(int)st.nval;
add(x,y,k,root);
}else {
st.nextToken();
x=(int)st.nval;
st.nextToken();
y=(int)st.nval;
printQueue.add(getByRange(x,y,root));
}
}
for (Long aLong : printQueue) {
System.out.println(aLong);
}
}
}