#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
ll mod = 1e9+7;
ll qp(ll a, ll b=mod-2) {
if(b==0) return 1;
if(b==1) return a%mod;
if(b%2) return (a * qp(a,b-1))%mod;
ll x = qp(a,b/2);
return (x*x)%mod;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ll n, q;
cin >> n >> q;
vector<ll> a(n), b(n);
for(ll i=0; i<n; ++i) cin >> a[i] >> b[i];
vector<pair<ll, ll>> sufix(n+5, {1,0});
for(ll i=n-1; i>=0; --i) {
sufix[i] = sufix[i+1];
if(b[i]==1) sufix[i].second = (sufix[i].second + (a[i] * sufix[i].first))%mod;
else sufix[i].first = (sufix[i].first * b[i])%mod;
}
vector<ll> right(n+1), sum(n+1);
right[n] = n;
for(ll i=n-1; i>=0; --i) {
if(b[i]==1) {
right[i] = right[i+1];
sum[i] = a[i] + sum[i+1];
} else right[i] = i;
}
while(q--) {
ll res, l, r;
cin >> res >> l >> r;
ll i = l;
while(i < r) {
if(b[i] == 1) {
if(right[i] > r) {
res += sum[i] - sum[r];
} else res += sum[i];
i = right[i];
} else {
if(res * b[i] > res + a[i]) {
res *= b[i];
} else res += a[i];
++i;
}
if(res > mod) {
res%=mod;
if(i<r) {
res = (sufix[i].first * res + sufix[i].second - sufix[r].second)%mod;
res *= qp(sufix[r].first);
res %= mod;
}
i=r;
}
}
cout << (res+mod)%mod << "\n";
}
return 0;
}
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 | #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> typedef long long ll; using namespace __gnu_pbds; using namespace std; template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; ll mod = 1e9+7; ll qp(ll a, ll b=mod-2) { if(b==0) return 1; if(b==1) return a%mod; if(b%2) return (a * qp(a,b-1))%mod; ll x = qp(a,b/2); return (x*x)%mod; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n, q; cin >> n >> q; vector<ll> a(n), b(n); for(ll i=0; i<n; ++i) cin >> a[i] >> b[i]; vector<pair<ll, ll>> sufix(n+5, {1,0}); for(ll i=n-1; i>=0; --i) { sufix[i] = sufix[i+1]; if(b[i]==1) sufix[i].second = (sufix[i].second + (a[i] * sufix[i].first))%mod; else sufix[i].first = (sufix[i].first * b[i])%mod; } vector<ll> right(n+1), sum(n+1); right[n] = n; for(ll i=n-1; i>=0; --i) { if(b[i]==1) { right[i] = right[i+1]; sum[i] = a[i] + sum[i+1]; } else right[i] = i; } while(q--) { ll res, l, r; cin >> res >> l >> r; ll i = l; while(i < r) { if(b[i] == 1) { if(right[i] > r) { res += sum[i] - sum[r]; } else res += sum[i]; i = right[i]; } else { if(res * b[i] > res + a[i]) { res *= b[i]; } else res += a[i]; ++i; } if(res > mod) { res%=mod; if(i<r) { res = (sufix[i].first * res + sufix[i].second - sufix[r].second)%mod; res *= qp(sufix[r].first); res %= mod; } i=r; } } cout << (res+mod)%mod << "\n"; } return 0; } |
English