1 2 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
| import java.io.*; import java.util.*; public class Main { static int[]shu; public static void main(String[] args) { FastScanner sc = new FastScanner(); PrintWriter pw = new PrintWriter(System.out); int c=sc.nextInt(); while (sc.hasNext()) { int n=sc.nextInt(); int m=sc.nextInt(); shu=new int[n+1]; SegTree tree=new SegTree(n+1); for(int i=1;i<=n;i++){ shu[i]=sc.nextInt(); } for(int i=0;i<m;i++){ int t=sc.nextInt(); if(t==1){ int l=sc.nextInt(); int r=sc.nextInt(); int add=sc.nextInt(); tree.regupdate(l, r+1, add); }else{ int index=sc.nextInt(); pw.println(tree.regquery(index, index+1,shu)); } } pw.flush(); } } } class Node{ long shu; long lazy; long maxchange; long minchange; Node(long num,long lazy){ this.shu=num; this.lazy=lazy; this.maxchange=0; this.minchange=0; } } class SegTree{ long[]lazy=new long[400050]; long[]maxchange=new long[400050]; long[]minchange=new long[400050]; int n; SegTree(int n_){ this.n=1; while(n<n_){ n*=2; } } void pushdown(int num,int l,int r){ maxchange[num*2+1]=Math.max(maxchange[num]+lazy[num*2+1], maxchange[num*2+1]); minchange[num*2+1]=Math.min(minchange[num]+lazy[num*2+1], minchange[num*2+1]); maxchange[num*2+2]=Math.max(maxchange[num]+lazy[num*2+2], maxchange[num*2+2]); minchange[num*2+2]=Math.min(minchange[num]+lazy[num*2+2], minchange[num*2+2]); lazy[num*2+1]+=lazy[num]; lazy[num*2+2]+=lazy[num]; lazy[num]=0; maxchange[num]=0; minchange[num]=0; } void update(int num,int l,int r,long add,int x,int y){ if(r<=x||l>=y)return; if(l<=x&&r>=y){ lazy[num]+=add; maxchange[num]=Math.max(maxchange[num], lazy[num]); minchange[num]=Math.min(minchange[num], lazy[num]); return; } pushdown(num,x,y); update(num*2+1,l,r,add,x,(x+y)/2); update(num*2+2,l,r,add,(x+y)/2,y); } void regupdate(int l,int r,int add){ update(0,l,r,add,0,n); } long regquery(int l,int r,int[]shu){ return query(0,l,r,0,n,shu); } long query(int num,int l,int r,int x,int y,int[]shu){ if(r<=x||l>=y)return 0; if(l<=x&&r>=y){ return Math.max(Math.abs(shu[l]+maxchange[num]), Math.abs(shu[l]+minchange[num])); } pushdown(num,x,y); long left=query(num*2+1,l,r,x,(x+y)/2,shu); long right=query(num*2+2,l,r,(x+y)/2,y,shu); if(left!=0) return left; else return right; } }
|