#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
int main(){
int n, q;
cin >> n >> q;
vector<array<long long, 2>> tab(n);
long long prefs[n], nextj[n];
vector<vector<pair<long long, long long>>> dp(20, vector<pair<long long, long long>>(n));
for(int i = 0; i < n; i++){
cin >> tab[i][0] >> tab[i][1];
prefs[i] = tab[i][0] + (i > 0 ? prefs[i-1] : 0);
}
for(int i = n-1; i >= 0; i--){
nextj[i] = i;
if(i < n-1 && tab[i][1] == 1 && tab[i+1][1] == 1) nextj[i] = nextj[i+1];
if(tab[i][1] == 1) dp[0][i] = {1, tab[i][0]};
else dp[0][i] = {tab[i][1], 0};
}
int d = 1;
for(int l = 1; l < 20; l++){
d*=2;
for(int i = 0; i < n; i++){
if(i+d-1 >= n) continue;
dp[l][i] = {dp[l-1][i].first * dp[l-1][i+(d/2)].first, (dp[l-1][i].second * dp[l-1][i+(d/2)].first)%mod + dp[l-1][i+(d/2)].second};
dp[l][i] = {dp[l][i].first%mod, dp[l][i].second%mod};
}
}
for(int i = 0; i < q; i++){
long long x, l, r;
cin >> x >> l >> r;
for(int j = l; x < mod && j < r; j++){
if(tab[j][1] == 1){
if(j == 0) x += prefs[min(r-1, nextj[j])];
else x += prefs[min(r-1, nextj[j])]-prefs[j-1];
j = min(r-1, nextj[j]);
}else{
x = max(x*tab[j][1], x+tab[j][0]);
}
l = j;
}
x = x%mod;
int j = l+1, p = 19;
d = 1 << 19;
while(j < r){
if(j+d-1 >= r){
d/=2;
p--;
}else{
x = ((x*dp[p][j].first)%mod + dp[p][j].second)%mod;
j += d;
}
}
cout << x << endl;
}
}
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 | #include <bits/stdc++.h> using namespace std; const long long mod = 1e9+7; int main(){ int n, q; cin >> n >> q; vector<array<long long, 2>> tab(n); long long prefs[n], nextj[n]; vector<vector<pair<long long, long long>>> dp(20, vector<pair<long long, long long>>(n)); for(int i = 0; i < n; i++){ cin >> tab[i][0] >> tab[i][1]; prefs[i] = tab[i][0] + (i > 0 ? prefs[i-1] : 0); } for(int i = n-1; i >= 0; i--){ nextj[i] = i; if(i < n-1 && tab[i][1] == 1 && tab[i+1][1] == 1) nextj[i] = nextj[i+1]; if(tab[i][1] == 1) dp[0][i] = {1, tab[i][0]}; else dp[0][i] = {tab[i][1], 0}; } int d = 1; for(int l = 1; l < 20; l++){ d*=2; for(int i = 0; i < n; i++){ if(i+d-1 >= n) continue; dp[l][i] = {dp[l-1][i].first * dp[l-1][i+(d/2)].first, (dp[l-1][i].second * dp[l-1][i+(d/2)].first)%mod + dp[l-1][i+(d/2)].second}; dp[l][i] = {dp[l][i].first%mod, dp[l][i].second%mod}; } } for(int i = 0; i < q; i++){ long long x, l, r; cin >> x >> l >> r; for(int j = l; x < mod && j < r; j++){ if(tab[j][1] == 1){ if(j == 0) x += prefs[min(r-1, nextj[j])]; else x += prefs[min(r-1, nextj[j])]-prefs[j-1]; j = min(r-1, nextj[j]); }else{ x = max(x*tab[j][1], x+tab[j][0]); } l = j; } x = x%mod; int j = l+1, p = 19; d = 1 << 19; while(j < r){ if(j+d-1 >= r){ d/=2; p--; }else{ x = ((x*dp[p][j].first)%mod + dp[p][j].second)%mod; j += d; } } cout << x << endl; } } |
English