using System; using System.Linq; using System.IO; using System.Collections.Generic; using static System.Math; class SegTree { public long[] data; public long[] lazydata; private int num; private long ide_ele; private long F(long x, long y){ return x > y ? x : y; } private int Pow(int x, int y){ int r = 1; for (int i = 0; i < y; i++){ r *= x; } return r; } private List Gindices(int l, int r){ List R = new List(); l += num; r += num; int lm = (l / (l & -l))>>1; int rm = (r / (r & -r))>>1; //Console.WriteLine(rm); while (l < r){ if (r <= rm){ R.Add(r-1); } if (l <= lm){ R.Add(l-1); } l >>= 1; r >>= 1; } while (l > 0){ R.Add(l-1); l >>= 1; } return R; } private void Propagate(List indices){ foreach(int i in indices.AsEnumerable().Reverse()){ long v = lazydata[i]; lazydata[i] = 0; if (v==0) continue; lazydata[2*i+1] += v; data[2*i+1] += v; lazydata[2*i+2] += v; data[2*i+2] += v; } } public void Update(int i, long x){ i += num-1; data[i] = x; while (i>0){ i = (i-1)>>1; data[i] = F(data[2*i+1], data[2*i+2]); } } public void UpdateRange(int l, int r, long x){ //Console.WriteLine($"{l}, {r}"); List gindices = Gindices(l, r); l += num; r += num; while (l < r){ if (l%2 == 1){ lazydata[l-1] += x; data[l-1] += x; l++; } if (r%2 == 1){ r--; lazydata[r-1] += x; data[r-1] += x; } l >>= 1; r >>= 1; } foreach(int i in gindices){ //Console.WriteLine(i); data[i] = F(data[2*i+1], data[2*i+2]) + lazydata[i]; } } public long Query(int l, int r){ Propagate(Gindices(l, r)); l += num; r += num; long R = ide_ele; while (l < r){ //Console.WriteLine($"Q {l-1} {r-2}"); if (l%2 == 1){ R = F(R, data[l-1]); l++; } if (r%2 == 1){ r--; R = F(R, data[r-1]); } l >>= 1; r >>= 1; } return R; } public SegTree(long[] values, long ide_ele) { int N = values.Length; this.ide_ele = ide_ele; int tmp = N+1; // 遅延操作のため1段多く作る int r = 0; while (tmp > 0){ tmp >>= 1; r++; } num = Pow(2, r); data = new long[2*num]; lazydata = new long[2*num]; for (int i = 0; i < N; i++){ data[i+num-1] = values[i]; } for (int i = num - 2; i >= 0; i--){ data[i] = F(data[2*i+1], data[2*i+2]); } } } class P { static int[] Input(){ return Console.ReadLine().Split().Select(int.Parse).ToArray(); } static int[][] Input2(int n){ int[][] X = new int[n][]; for(int i = 0; i < n; i++){ X[i] = Input(); } return X; } static void Main() { int[] NQ = Input(); int[] A = Input(); var ql = new List<(string type, int x, int y)>(); for(int i=0;i=0;i--){ var qi = ql[i]; if(qi.type == "A"){ B[qi.x] += qi.y * x.Query(qi.x, qi.x+1); }else{ x.UpdateRange(qi.x, qi.y, 1); } } var sw = new StreamWriter(Console.OpenStandardOutput()){AutoFlush = false}; Console.SetOut(sw); Console.WriteLine(string.Join(" ", B)); Console.Out.Flush(); } }