#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ve vector
#define fi first
#define se second
#define pb push_back
#define all(x) begin(x), end(x)
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <int MOD>
struct modint {
int value;
static const int MOD_value = MOD;
modint(long long v = 0) { value = v % MOD; if (value < 0) value += MOD;}
modint(long long a, long long b) : value(0){ *this += a; *this /= b;}
modint& operator+=(modint const& b) {value += b.value; if (value >= MOD) value -= MOD; return *this;}
modint& operator-=(modint const& b) {value -= b.value; if (value < 0) value += MOD;return *this;}
modint& operator*=(modint const& b) {value = (long long)value * b.value % MOD;return *this;}
friend modint mexp(modint a, long long e) {
modint res = 1; while (e) { if (e&1) res *= a; a *= a; e >>= 1; }
return res;
}
friend modint inverse(modint a) { return mexp(a, MOD - 2); }
modint& operator/=(modint const& b) { return *this *= inverse(b); }
friend modint operator+(modint a, modint const b) { return a += b; }
friend modint operator-(modint a, modint const b) { return a -= b; }
friend modint operator-(modint const a) { return 0 - a; }
friend modint operator*(modint a, modint const b) { return a *= b; }
friend modint operator/(modint a, modint const b) { return a /= b; }
friend std::ostream& operator<<(std::ostream& os, modint const& a) {return os << a.value;}
friend bool operator==(modint const& a, modint const& b) {return a.value == b.value;}
friend bool operator!=(modint const& a, modint const& b) {return a.value != b.value;}
};
typedef modint<1'000'000'007> mint;
void solve(){
int n, q;
cin >> n >> q;
ve<pll> v(n);
for(auto& i : v)
cin >> i.fi >> i.se;
ve<mint> prod(n+1, 1);
ve<ll> sum(n+1, 0);
ve<mint> sum2(n+1, 0);
for(int i = 1; i <= n; i++){
prod[i] = prod[i-1]*v[i-1].se;
sum[i] = sum[i-1];
if(v[i-1].se == 1)
sum[i] += v[i-1].fi;
}
for(int i = 1; i <= n; i++){
sum2[i] = sum2[i-1];
if(v[i-1].se == 1)
sum2[i] += (prod[n]/prod[i])*v[i-1].fi;
}
ve<int> nxt(n, n);
for(int i = n - 2; i >= 0; i--){
if(v[i+1].se == 1)
nxt[i] = nxt[i+1];
else nxt[i] = i + 1;
}
while(q--){
int l, r;
ll res = 0;
cin >> res >> l >> r;
r--;
while(l < n && res < 1e9+100 && nxt[l] <= r+1){
res = max(res*v[l].se, res+v[l].fi);
res += sum[nxt[l]] - sum[l+1];
l = nxt[l];
}
if(l <= r){
res = max(res*v[l].se, res+v[l].fi);
l++;
}
mint ans = (prod[r+1]/prod[l])*res;
ans += (sum2[r+1]-sum2[l])/(prod[n]/prod[r+1]);
cout << ans << "\n";
}
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int T = 1;
// cin >> T;
while(T--) solve();
}
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include <bits/stdc++.h> using namespace std; #define ll long long #define ve vector #define fi first #define se second #define pb push_back #define all(x) begin(x), end(x) typedef pair<int, int> pii; typedef pair<ll, ll> pll; template <int MOD> struct modint { int value; static const int MOD_value = MOD; modint(long long v = 0) { value = v % MOD; if (value < 0) value += MOD;} modint(long long a, long long b) : value(0){ *this += a; *this /= b;} modint& operator+=(modint const& b) {value += b.value; if (value >= MOD) value -= MOD; return *this;} modint& operator-=(modint const& b) {value -= b.value; if (value < 0) value += MOD;return *this;} modint& operator*=(modint const& b) {value = (long long)value * b.value % MOD;return *this;} friend modint mexp(modint a, long long e) { modint res = 1; while (e) { if (e&1) res *= a; a *= a; e >>= 1; } return res; } friend modint inverse(modint a) { return mexp(a, MOD - 2); } modint& operator/=(modint const& b) { return *this *= inverse(b); } friend modint operator+(modint a, modint const b) { return a += b; } friend modint operator-(modint a, modint const b) { return a -= b; } friend modint operator-(modint const a) { return 0 - a; } friend modint operator*(modint a, modint const b) { return a *= b; } friend modint operator/(modint a, modint const b) { return a /= b; } friend std::ostream& operator<<(std::ostream& os, modint const& a) {return os << a.value;} friend bool operator==(modint const& a, modint const& b) {return a.value == b.value;} friend bool operator!=(modint const& a, modint const& b) {return a.value != b.value;} }; typedef modint<1'000'000'007> mint; void solve(){ int n, q; cin >> n >> q; ve<pll> v(n); for(auto& i : v) cin >> i.fi >> i.se; ve<mint> prod(n+1, 1); ve<ll> sum(n+1, 0); ve<mint> sum2(n+1, 0); for(int i = 1; i <= n; i++){ prod[i] = prod[i-1]*v[i-1].se; sum[i] = sum[i-1]; if(v[i-1].se == 1) sum[i] += v[i-1].fi; } for(int i = 1; i <= n; i++){ sum2[i] = sum2[i-1]; if(v[i-1].se == 1) sum2[i] += (prod[n]/prod[i])*v[i-1].fi; } ve<int> nxt(n, n); for(int i = n - 2; i >= 0; i--){ if(v[i+1].se == 1) nxt[i] = nxt[i+1]; else nxt[i] = i + 1; } while(q--){ int l, r; ll res = 0; cin >> res >> l >> r; r--; while(l < n && res < 1e9+100 && nxt[l] <= r+1){ res = max(res*v[l].se, res+v[l].fi); res += sum[nxt[l]] - sum[l+1]; l = nxt[l]; } if(l <= r){ res = max(res*v[l].se, res+v[l].fi); l++; } mint ans = (prod[r+1]/prod[l])*res; ans += (sum2[r+1]-sum2[l])/(prod[n]/prod[r+1]); cout << ans << "\n"; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); int T = 1; // cin >> T; while(T--) solve(); } |
English