// // Created by HandwerSTD on 2019/10/23. // Copyright (c) 2019 HandwerSTD. All rights reserved. // Title: 区间方差 // // sto Qingyu orz // 感谢真神sqy无私的教诲。膜时队者处处阿克,只因大师sqy在他背后。不膜大师者违背了真神的旨意,真神必将降下天谴, // 使其天天爆零 // 我不由自主地膜拜真神sqy。 //
#include<cstdio>
#define rap(a,s,t,i) for (int a = s; a <= t; a += i) #define lb(x,y) ((x = x + y * (x & (-x))))
lli qu(int p){ lli r = 0; while (p >= 1) { (r += bit[p]) %= HA; lb(p, -1ll); } return r; } lli qux(int p){ lli r = 0; while (p >= 1) { (r += bitt[p]) %= HA; lb(p, -1ll); } return r; } voidmo(int p, lli x){ lli d = x - (qu(p) - qu(p - 1)), dx = x * x - (qux(p) - qux(p - 1)); while (p <= n) { bit[p] = (bit[p] + d) % HA; bitt[p] = (bitt[p] + dx) % HA; lb(p, 1ll); } } lli pw(lli a, lli b){ lli r = 1; while (b) { if (b & 1) r = r * a % HA; a = a * a % HA; b >>= 1; } return r; } lli inv(lli a){ return pw(a, HA - 2); }
intmain(){ n = getint(); m = getint(); rap (i, 1, n, 1) mo(i, getint()); rap (i, 1, m, 1) { int c = getint(); int x = getint(); int y = getint(); if (c == 1) mo(x, y); else { lli N = (y - x + 1); lli iN = inv(N); lli fx = (qu(y) - qu(x - 1) + HA) % HA, gx = (qux(y) - qux(x - 1) + HA) % HA; lli tx = (iN * gx % HA - iN * iN % HA * fx % HA * fx % HA); while (tx <= 0) tx += HA; tx %= HA; printf("%lld\n", tx % HA); } } return0; }