#include <bits/stdc++.h>
using namespace std;
const int MOD=1000000007;
struct fregus
{
long long d;
long long c;
};
int n,q;
vector<long long> a,b,pref;
vector<int> frongus;
vector<fregus> tree;
fregus wylej(const fregus& L, const fregus& R)
{
return
{
(L.d*R.d) % MOD,
(R.d*L.c+R.c) % MOD
};
}
void build(int current, int l, int r)
{
if (l==r)
{
if (b[l]>1) tree[current]={b[l] % MOD,0};
else tree[current]={1,a[l]%MOD};
return;
}
int mid=(l+r)/2;
build(2*current,l,mid);
build(2*current+1,mid+1,r);
tree[current]=wylej(tree[2*current],tree[2*current+1]);
}
fregus query(int current,int l,int r,int ql,int qr)
{
if (l==ql&&r==qr) return tree[current];
int mid=(l+r)/2;
if (qr<=mid) return query(2*current,l,mid,ql,qr);
if (ql>mid) return query(2*current+1,mid+1,r,ql,qr);
return wylej(query(2*current,l,mid,ql,mid),
query(2*current+1,mid+1,r,mid+1,qr));
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
a.assign(n+1,0);
b.assign(n+1,0);
pref.assign(n+1,0);
frongus.assign(n+2,n+1);
for (int i=1; i<=n; i++) {
cin>>a[i]>>b[i];
pref[i]=pref[i-1]+a[i];
}
for (int i=n; i>=1; i--)
{
if(b[i]>1)
{
frongus[i]=i;
}
else
{
frongus[i]=frongus[i+1];
}
}
tree.resize(4*n+1);
build(1,1,n);
while (q--)
{
long long x;
int l,r;
cin>>x>>l>>r;
int curr=l+1;
while (curr<=r&&x<MOD)
{
int nxt=frongus[curr];
if (nxt>r)
{
x+=pref[r]-pref[curr-1];
curr=r+1;
break;
}
x+=pref[nxt-1]-pref[curr-1];
if (x>=MOD)
{
curr=nxt;
break;
}
x=max(x+a[nxt],x*b[nxt]);
curr=nxt+1;
}
if (curr<=r)
{
fregus res=query(1, 1, n, curr, r);
x =(res.d*(x % MOD)+res.c)% MOD;
}
cout <<x%MOD<<"\n";
}
}
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 98 99 100 101 | #include <bits/stdc++.h> using namespace std; const int MOD=1000000007; struct fregus { long long d; long long c; }; int n,q; vector<long long> a,b,pref; vector<int> frongus; vector<fregus> tree; fregus wylej(const fregus& L, const fregus& R) { return { (L.d*R.d) % MOD, (R.d*L.c+R.c) % MOD }; } void build(int current, int l, int r) { if (l==r) { if (b[l]>1) tree[current]={b[l] % MOD,0}; else tree[current]={1,a[l]%MOD}; return; } int mid=(l+r)/2; build(2*current,l,mid); build(2*current+1,mid+1,r); tree[current]=wylej(tree[2*current],tree[2*current+1]); } fregus query(int current,int l,int r,int ql,int qr) { if (l==ql&&r==qr) return tree[current]; int mid=(l+r)/2; if (qr<=mid) return query(2*current,l,mid,ql,qr); if (ql>mid) return query(2*current+1,mid+1,r,ql,qr); return wylej(query(2*current,l,mid,ql,mid), query(2*current+1,mid+1,r,mid+1,qr)); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> q; a.assign(n+1,0); b.assign(n+1,0); pref.assign(n+1,0); frongus.assign(n+2,n+1); for (int i=1; i<=n; i++) { cin>>a[i]>>b[i]; pref[i]=pref[i-1]+a[i]; } for (int i=n; i>=1; i--) { if(b[i]>1) { frongus[i]=i; } else { frongus[i]=frongus[i+1]; } } tree.resize(4*n+1); build(1,1,n); while (q--) { long long x; int l,r; cin>>x>>l>>r; int curr=l+1; while (curr<=r&&x<MOD) { int nxt=frongus[curr]; if (nxt>r) { x+=pref[r]-pref[curr-1]; curr=r+1; break; } x+=pref[nxt-1]-pref[curr-1]; if (x>=MOD) { curr=nxt; break; } x=max(x+a[nxt],x*b[nxt]); curr=nxt+1; } if (curr<=r) { fregus res=query(1, 1, n, curr, r); x =(res.d*(x % MOD)+res.c)% MOD; } cout <<x%MOD<<"\n"; } } |
English