#include <bits/stdc++.h>
#define MOD 1000000007
#define ls (n<<1)
#define rs ((n<<1)|1)
#define md ((l+r)>>1)
int N,Q,a[500009],b[500009],s1[2000009],s2[2000009],
aa[500009],cl[500009],tt,la[500009];
long long su[500009];
void sv(int& x,int n,int l,int r,int L,int R) {
if(r<L||R<l||L>R) return;
if(L<=l&&r<=R) {
x=(1ll*x*s1[n]+s2[n])%MOD;
return;
}
sv(x,ls,l,md,L,R);
sv(x,rs,md+1,r,L,R);
}
void bd(int n,int l,int r) {
if(l==r) {
if(b[l]==1) s1[n]=1,s2[n]=a[l];
else s1[n]=b[l],s2[n]=0;
return;
}
bd(ls,l,md),bd(rs,md+1,r);
s1[n]=1ll*s1[ls]*s1[rs]%MOD;
s2[n]=(1ll*s2[ls]*s1[rs]+s2[rs])%MOD;
}
signed main(void) {
scanf("%d %d",&N,&Q);
for(int i=1;i<=N;i++) {
scanf("%d %d",&a[i],&b[i]);
su[i]=su[i-1]+a[i];
if(b[i]>1) {
aa[++tt]=i;
}
if(a[i]!=0) la[i]=i;
}
la[N+1]=N+1;
for(int i=N;i>=1;i--) {
if(la[i]==0) la[i]=la[i+1];
}
aa[tt+1]=N+1;
for(int i=1;i<=tt;i++) {
for(int j=aa[i-1]+1;j<=aa[i];j++)cl[j]=i;
}
for(int j=aa[tt]+1;j<=N;j++) cl[j]=tt+1;
bd(1,1,N);
while(Q--) {
int l,r,x;
scanf("%d %d %d",&x,&l,&r);
l++;
if(x==0) {
int qq=la[l];
if(qq>r) {
printf("0\n");
continue;
}
assert(l<=qq);
l=qq;
assert(a[l]!=0);
}
while(l<=r) {
int po=aa[cl[l]];
if(po>r) {
x=(x+su[r]-su[l-1])%MOD;
break;
}
if(x+su[po-1]-su[l-1]>=MOD) {
sv(x,1,1,N,l,r);
break;
}
x+=su[po-1]-su[l-1];
l=po;
long long ww=std::max(1ll*x*b[l],(long long)x+a[l]);
// assert(b[l]>1);
if(ww>=MOD) {
x=ww%MOD;
sv(x,1,1,N,l+1,r);
break;
}
x=ww;
// assert(x);
l++;
}
printf("%d\n",x);
}
}
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 | #include <bits/stdc++.h> #define MOD 1000000007 #define ls (n<<1) #define rs ((n<<1)|1) #define md ((l+r)>>1) int N,Q,a[500009],b[500009],s1[2000009],s2[2000009], aa[500009],cl[500009],tt,la[500009]; long long su[500009]; void sv(int& x,int n,int l,int r,int L,int R) { if(r<L||R<l||L>R) return; if(L<=l&&r<=R) { x=(1ll*x*s1[n]+s2[n])%MOD; return; } sv(x,ls,l,md,L,R); sv(x,rs,md+1,r,L,R); } void bd(int n,int l,int r) { if(l==r) { if(b[l]==1) s1[n]=1,s2[n]=a[l]; else s1[n]=b[l],s2[n]=0; return; } bd(ls,l,md),bd(rs,md+1,r); s1[n]=1ll*s1[ls]*s1[rs]%MOD; s2[n]=(1ll*s2[ls]*s1[rs]+s2[rs])%MOD; } signed main(void) { scanf("%d %d",&N,&Q); for(int i=1;i<=N;i++) { scanf("%d %d",&a[i],&b[i]); su[i]=su[i-1]+a[i]; if(b[i]>1) { aa[++tt]=i; } if(a[i]!=0) la[i]=i; } la[N+1]=N+1; for(int i=N;i>=1;i--) { if(la[i]==0) la[i]=la[i+1]; } aa[tt+1]=N+1; for(int i=1;i<=tt;i++) { for(int j=aa[i-1]+1;j<=aa[i];j++)cl[j]=i; } for(int j=aa[tt]+1;j<=N;j++) cl[j]=tt+1; bd(1,1,N); while(Q--) { int l,r,x; scanf("%d %d %d",&x,&l,&r); l++; if(x==0) { int qq=la[l]; if(qq>r) { printf("0\n"); continue; } assert(l<=qq); l=qq; assert(a[l]!=0); } while(l<=r) { int po=aa[cl[l]]; if(po>r) { x=(x+su[r]-su[l-1])%MOD; break; } if(x+su[po-1]-su[l-1]>=MOD) { sv(x,1,1,N,l,r); break; } x+=su[po-1]-su[l-1]; l=po; long long ww=std::max(1ll*x*b[l],(long long)x+a[l]); // assert(b[l]>1); if(ww>=MOD) { x=ww%MOD; sv(x,1,1,N,l+1,r); break; } x=ww; // assert(x); l++; } printf("%d\n",x); } } |
English