Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //misaka and elaina will carry me to master
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <utility>
- #include <cassert>
- #include <algorithm>
- #include <vector>
- #include <functional>
- #include <numeric>
- #include <set>
- #include <array>
- #include <queue>
- #include <map>
- #include <chrono>
- #include <random>
- #define ll long long
- #define lb long double
- #define sz(vec) ((int)(vec.size()))
- #define all(x) x.begin(), x.end()
- #define pb push_back
- #define mp make_pair
- #define kill(x, s) {int COND = x; if(COND){ cout << s << "\n"; return ; }}
- #ifdef ONLINE_JUDGE
- #define cerr while(0) cerr
- #endif
- const lb eps = 1e-9;
- const ll mod = 1e9 + 7, ll_max = 1e18;
- //const ll mod = (1 << (23)) * 119 +1, ll_max = 1e18;
- const int MX = 2e5 +10, int_max = 0x3f3f3f3f;
- struct {
- template<class T>
- operator T() {
- T x; std::cin >> x; return x;
- }
- } in;
- using namespace std;
- int a[MX], b[MX], c[MX], d[MX];
- int n, q;
- vector<pair<int, int>> cache;
- const int magic = 800;
- inline int form(int i){
- return (1ll*i*(i+1)/2)%mod;//%mod * (i+2)%mod * inv%mod;
- }
- void rebuild(){
- cache.clear();
- for(int i = 1; i<=n; i++){
- b[i] = b[i-1] + a[i];
- if(b[i] > mod) b[i] -= mod;
- //a[i] %= mod;
- }
- for(int i = 1; i<=n; i++){
- c[i] = c[i-1] + b[i];
- if(c[i] > mod) c[i] -= mod;
- //c[i] %= mod;
- }
- for(int i = 1; i<=n; i++){
- d[i] = d[i-1] + c[i];
- if(d[i] > mod) d[i] -= mod;
- //d[i] %= mod;
- }
- }
- int contr(int x){
- int ans = 0;
- for(auto [i, v] : cache){
- if(x < i) continue ;
- ans += 1ll*form(x -i + 1) * v%mod;
- if(ans > mod) ans -= mod;
- //ans %= mod;
- }
- return ans;
- }
- void solve(){
- n = in, q=in;
- //a[1] = 1;
- for(int i= 1; i<=n; i++){
- a[i] = in;
- }
- rebuild();
- cache.reserve(magic);
- for(int i = 1; i<=q; i++){
- int op = in;
- if(op == 1){
- int j = in, b = in;
- cache.pb(mp(j, (b + mod - a[j])%mod));
- a[j] = b;
- }else{
- int a = in;
- cout << (d[a] + contr(a))%mod << "\n";
- }
- if(sz(cache) > magic){
- rebuild();
- cache.reserve(magic);
- }
- }
- }
- signed main(){
- cin.tie(0) -> sync_with_stdio(0);
- int T = 1;
- //cin >> T;
- for(int i = 1; i<=T; i++){
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement