2
private ArrayList<Long> lst;3
private ArrayList<Long> add;4
private ArrayList<Long> mult;5
private final long MOD = 1000000007;8
lst = new ArrayList<>();9
add = new ArrayList<>();10
mult = new ArrayList<>();15
public void append(int val) {18
add.add(add.get(l - 1));19
mult.add(mult.get(l - 1));22
public void addAll(int inc) {24
add.set(l - 1, add.get(l - 1) + inc);27
public void multAll(int m) {29
add.set(l - 1, (add.get(l - 1) * m) % MOD);30
mult.set(l - 1, (mult.get(l - 1) * m) % MOD);33
public int getIndex(int idx) {34
if (idx >= lst.size()) return -1;37
long m = (mult.get(l - 1) * inverse(mult.get(idx))) % MOD;38
long a = (add.get(l - 1) - (add.get(idx) * m) % MOD + MOD) % MOD;39
return (int) (((lst.get(idx) * m) % MOD + a) % MOD);42
long inverse(long a) {43
return pow(a, MOD - 2);46
long pow(long a, long n) {49
long t = pow(a, n / 2);52
return (pow(a, n - 1) * a) % MOD;