#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
#define rep(a,b) for(int a = 0; a < (b); ++a)
#define all(t) t.begin(), t.end()
#define pb push_back
#define fi first
#define se second
#define each(a,x) for(auto &a:x)
#define vi vector<int>
#define vll vector<ll>
#define vull vector<ull>
#define pi pair<int,int>
#define pll pair<ll,ll>
#define nl '\n'
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("avx2")
#pragma GCC target("bmi")
#pragma GCC target("bmi2")
#pragma GCC target("lzcnt")
#pragma GCC target("popcnt")
const int N = 5e5+1234,INF = 2e9+1234,mod = 1e9+7;
const ll INF_L = (ll)2e18+1234;
struct Node
{
int a,b;
};
int n,q,base,rozd;
vector<Node> tree;
Node merge(Node e1, Node e2)
{
int v1=((ll)e1.a*e2.b+e2.a)%mod;
int v2=((ll)e1.b*e2.b)%mod;
return{v1,v2};
}
Node query(int l, int r)
{
++r; Node rL={0,1},rP={0,1};
for(l+=base,r+=base;l<r;l >>= 1, r >>= 1)
{
if(l&1) rL=merge(rL,tree[l++]);
if(r&1) rP=merge(tree[--r],rP);
}
return merge(rL,rP);
}
void solve()
{
cin >> n >> q;
vector<int> A(n+1),B(n+1),NE(n+5);vector<ll>S(n+1);
for(int i=1;i<=n;++i) cin >> A[i] >> B[i];
base=1;while(base<=n+10)base*=2;
rozd=base*2;tree.assign(rozd,{0,0});
for(int i=1;i<=n;++i)
{
if(B[i]==1) tree[i+base]={A[i],1};
else tree[i+base]={0,B[i]};
}
for(int i=base-1;i>=1;--i) tree[i]=merge(tree[i<<1],tree[i<<1|1]);
S[0]=0;for(int i=1;i<=n;++i) S[i]=S[i-1]+A[i];
NE[n+1]=n+1;
for(int i=n;i>=1;--i)
{
if(B[i]==1) NE[i]=NE[i+1];
else NE[i]=i;
}
rep(zz,q)
{
int xx,l,r;cin>>xx>>l>>r;++l;ll x=xx;
while(l<=r and x<mod)
{
if(B[l]>=2) x=max(x+A[l],x*B[l]),++l;
else
{
ll zas=NE[l]-1;
if(zas>=r)x=(x+S[r]-S[l-1]),l=r+1;
else x=(x+S[zas]-S[l-1]),l=zas+1;
}
}
x=(x%mod);
if(l>r) cout << x << nl;
else
{
Node akt=query(l,r);
x=(x*akt.b+akt.a)%mod;
cout << x << nl;
}
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T=1;
//cin >> T;
while(T--) solve();
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 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 | #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; #define rep(a,b) for(int a = 0; a < (b); ++a) #define all(t) t.begin(), t.end() #define pb push_back #define fi first #define se second #define each(a,x) for(auto &a:x) #define vi vector<int> #define vll vector<ll> #define vull vector<ull> #define pi pair<int,int> #define pll pair<ll,ll> #define nl '\n' #pragma GCC optimize ("O3") #pragma GCC optimize ("unroll-loops") #pragma GCC target("avx2") #pragma GCC target("bmi") #pragma GCC target("bmi2") #pragma GCC target("lzcnt") #pragma GCC target("popcnt") const int N = 5e5+1234,INF = 2e9+1234,mod = 1e9+7; const ll INF_L = (ll)2e18+1234; struct Node { int a,b; }; int n,q,base,rozd; vector<Node> tree; Node merge(Node e1, Node e2) { int v1=((ll)e1.a*e2.b+e2.a)%mod; int v2=((ll)e1.b*e2.b)%mod; return{v1,v2}; } Node query(int l, int r) { ++r; Node rL={0,1},rP={0,1}; for(l+=base,r+=base;l<r;l >>= 1, r >>= 1) { if(l&1) rL=merge(rL,tree[l++]); if(r&1) rP=merge(tree[--r],rP); } return merge(rL,rP); } void solve() { cin >> n >> q; vector<int> A(n+1),B(n+1),NE(n+5);vector<ll>S(n+1); for(int i=1;i<=n;++i) cin >> A[i] >> B[i]; base=1;while(base<=n+10)base*=2; rozd=base*2;tree.assign(rozd,{0,0}); for(int i=1;i<=n;++i) { if(B[i]==1) tree[i+base]={A[i],1}; else tree[i+base]={0,B[i]}; } for(int i=base-1;i>=1;--i) tree[i]=merge(tree[i<<1],tree[i<<1|1]); S[0]=0;for(int i=1;i<=n;++i) S[i]=S[i-1]+A[i]; NE[n+1]=n+1; for(int i=n;i>=1;--i) { if(B[i]==1) NE[i]=NE[i+1]; else NE[i]=i; } rep(zz,q) { int xx,l,r;cin>>xx>>l>>r;++l;ll x=xx; while(l<=r and x<mod) { if(B[l]>=2) x=max(x+A[l],x*B[l]),++l; else { ll zas=NE[l]-1; if(zas>=r)x=(x+S[r]-S[l-1]),l=r+1; else x=(x+S[zas]-S[l-1]),l=zas+1; } } x=(x%mod); if(l>r) cout << x << nl; else { Node akt=query(l,r); x=(x*akt.b+akt.a)%mod; cout << x << nl; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T=1; //cin >> T; while(T--) solve(); return 0; } |
English