标签:tag pre upd 第一个 -- git printf \n turn
\[ (a_1*a_2*...a_i)\pm(a_{i+1}*a_{i+2}*...a_j)\pm... \]
\[ (\prod_{i=1}^{n}a_i)+(\sum_{i=1}^{n-1}v_i). \]
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline int read()
{
int x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
const int P=1e9+7;
const int MAXN=1e5+10;
const int MAXV=1e4;
int n,m;
inline int add(int a,int b)
{
return (a + b) % P;
}
inline int mul(int a,int b)
{
return 1LL * a * b % P;
}
int fpow(int a,int b)
{
int res=1;
while(b)
{
if(b&1)
res=mul(res,a);
a=mul(a,a);
b>>=1;
}
return res;
}
int inv[MAXV+10],Pow[MAXN];
int a[MAXN],prod[MAXN];
struct node{
int l,r;
int sum,tag;
node()
{
tag=1;
}
}Tree[MAXN<<2];
#define root Tree[o]
#define lson Tree[o<<1]
#define rson Tree[o<<1|1]
void pushup(int o)
{
root.sum=add(lson.sum,rson.sum);
}
void BuildTree(int o,int l,int r)
{
root.l=l,root.r=r;
if(l==r)
{
//fpow(3,n-l-1) Pow[n-l-1]
int tmp=mul(Pow[n-l-1],2);
tmp=mul(tmp,prod[l]);
root.sum=tmp;
return;
}
int mid=(l+r)>>1;
BuildTree(o<<1,l,mid);
BuildTree(o<<1|1,mid+1,r);
pushup(o);
}
void Modifiy(int o,int c)
{
root.sum=mul(root.sum,c);
root.tag=mul(root.tag,c);
}
void pushdown(int o)
{
if(root.tag!=1)
{
Modifiy(o<<1,root.tag);
Modifiy(o<<1|1,root.tag);
root.tag=1;
}
}
void update(int o,int L,int R,int c)
{
int l=root.l,r=root.r;
if(l>R || r<l)
return;
if(L<=l && r<=R)
{
Modifiy(o,c);
return;
}
pushdown(o);
int mid=(l+r)>>1;
if(L<=mid)
update(o<<1,L,R,c);
if(R>mid)
update(o<<1|1,L,R,c);
pushup(o);
}
void init()
{
inv[1]=1;
for(int i=2;i<=MAXV;++i)
inv[i]=mul(P-P/i,inv[P%i]);
Pow[0]=1;
for(int i=1;i<=n;++i)
Pow[i]=mul(Pow[i-1],3);
}
int main()
{
n=read(),m=read();
init();
prod[0]=1;
for(int i=1;i<=n;++i)
prod[i]=mul(prod[i-1],a[i]=read());
BuildTree(1,1,n-1);
while(m--)
{
int i=read(),v=read();
int c=mul(v,inv[a[i]]);
a[i]=v;
prod[n]=mul(prod[n],c);
if(i<=n-1)
update(1,i,n-1,c);
int ans=add(Tree[1].sum,prod[n]);
printf("%d\n",ans);
}
return 0;
}
标签:tag pre upd 第一个 -- git printf \n turn
原文地址:https://www.cnblogs.com/jklover/p/10398010.html