定义区间是内部只含有乘号的区间。

对于区间左端点是 \(l \geq 2\) 的情况,左端点前头是加号的情况和前头是减号的情况的个数是相同的。因此这些区间不对答案产生贡献。

所以区间左端点必定是 \(1\)。当 \(r=n\) 时,这个区间产生一次贡献。当 \(r < n\) 时,这个区间产生 \(2 \times 3^{n-r-1}\) 次贡献。

掏出一棵支持区间乘,整体求和的线段树。

#include <iostream>
#include <cassert>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, m, a[100005], mi3[100005], v[100005], uu, vv;
const int mod=1e9+7;
int ksm(int a, int b){
int re=1;
while(b){
if(b&1) re = (ll)re * a % mod;
a = (ll)a * a % mod;
b >>= 1;
}
return re;
}
struct SGT{
int sum[400005], tag[400005];
void pushUp(int o, int lson, int rson){
sum[o] = (sum[lson] + sum[rson]) % mod;
}
void build(int o, int l, int r){
tag[o] = 1;
if(l==r) sum[o] = v[l];
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(l<=mid) build(lson, l, mid);
if(mid<r) build(rson, mid+1, r);
pushUp(o, lson, rson);
}
}
void pushDown(int o, int l, int r, int lson, int rson, int mid){
sum[lson] = (ll)sum[lson] * tag[o] % mod;
sum[rson] = (ll)sum[rson] * tag[o] % mod;
tag[lson] = (ll)tag[lson] * tag[o] % mod;
tag[rson] = (ll)tag[rson] * tag[o] % mod;
tag[o] = 1;
}
void update(int o, int l, int r, int x, int y, int k){
if(l>=x && r<=y){
sum[o] = (ll)sum[o] * k % mod;
tag[o] = (ll)tag[o] * k % mod;
}
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(tag[o]!=1) pushDown(o, l, r, lson, rson, mid);
if(x<=mid) update(lson, l, mid, x, y, k);
if(mid<y) update(rson, mid+1, r, x, y, k);
pushUp(o, lson, rson);
}
}
}sgt;
int main(){
cin>>n>>m;
mi3[0] = v[n] = 1;
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
mi3[i] = (ll)mi3[i-1] * 3 % mod;
}
int lia=1;
for(int i=1; i<n; i++){
lia = (ll)lia * a[i] % mod;
v[i] = (ll)lia * 2 * mi3[n-i-1] % mod;
}
lia = (ll)lia * a[n] % mod;
v[n] = lia;
sgt.build(1, 1, n);
while(m--){
scanf("%d %d", &uu, &vv);
sgt.update(1, 1, n, uu, n, ksm(a[uu],mod-2));
a[uu] = vv;
sgt.update(1, 1, n, uu, n, a[uu]);
printf("%d\n", sgt.sum[1]);
}
return 0;
}

最新文章

  1. Linux Socket编程
  2. 一个python线程池的源码解析
  3. hdu1071(抛物线弓形面积阿基米德算法)
  4. dissmiss a UISearchBar with an SearchBarController
  5. JAVA中的throws和throw的区别
  6. iOS App上架流程(2016详细版
  7. 轻松绕过极域电子教室、和教师控制 Say GoodBye
  8. ASP.NET Web API中的JSON和XML序列化
  9. HDU2063(二分图最大匹配)
  10. 代理(Proxy)模式
  11. jade 详解
  12. 嵌入式linux——点亮led灯(二)
  13. vue 自学笔记记录
  14. 每天进步一点点-Java IO操作-Java Serializable(对象序列化)的理解和总结
  15. 做 Excel 的 XML schema.xsd
  16. 转载:python 的包导入
  17. JSP隐含对象
  18. Java线程池停止空闲线程是否有规则呢?
  19. AC自动机算法学习
  20. SaaS多租户模式数据存储方案

热门文章

  1. SpringMVC+Thymeleaf 简单使用
  2. Android安卓电话拦截及短信过滤
  3. 【extjs6学习笔记】1.8 初始: ExtJS命名约定
  4. 【转载】UWP应用设置和文件设置:科普
  5. Aho-Corasick自动机
  6. Ab initio methods|Evidence-based methods|maximum-likelihood|branch-site|H1|H0|GO|dS/dN ratio
  7. 数据类型-------JavaScript
  8. linux简单常用命令
  9. error PRJ0019: 工具从 “正在执行生成后事件... ”
  10. Matlab-plot绘图