您的位置:首页 > 其它

hihocoder 1116 : 计算(线段树 区间合并)

2017-10-22 12:52 381 查看
l表示每个前缀之积的和

r表示每个后缀之积的和

m表示区间内所有数字之积

查询的结果就是整个区间的结果。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int MAXN = 1e5+10;
const int mod = 10007;

int sum[MAXN<<2];
int m[MAXN<<2];
int l[MAXN<<2];
int r[MAXN<<2];

void pushUp(int rt)
{
sum[rt] = (sum[rt<<1] + sum[rt<<1|1] + r[rt<<1]*l[rt<<1|1])%mod;
l[rt] = (l[rt<<1] + l[rt<<1|1]*m[rt<<1])%mod;
r[rt] = (r[rt<<1|1] + r[rt<<1]*m[rt<<1|1])%mod;
m[rt] = (m[rt<<1]*m[rt<<1|1])%mod;
}

void update(int l, int r, int rt, int pos, int val)
{
if(l == r)
{
sum[rt] = ::l[rt] = ::r[rt] = m[rt] = val%mod;
return;
}
int mid = (l+r) >> 1;
if(pos > mid) update(rson, pos, val);
else update(lson, pos, val);
pushUp(rt);
}

int main()
{
int n,q,x,val;
while(scanf("%d %d",&n,&q) != EOF)
{
memset(sum,0,sizeof(sum));
memset(m,0,sizeof(m));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
while(q--)
{
scanf("%d %d",&x,&val);
update(1,n,1,x,val);
printf("%d\n",sum[1]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: