时间限制:
4000ms
单点时限:
1000ms
内存限制:
256MB
-
5 5 1 1 2 1 3 1 4 1 5 1
样例输出
-
1 3 6 10 15
描述
现在有一个有n个元素的数组a1, a2, ..., an。
记f(i, j) = ai * ai+1 * ... * aj。
初始时,a1 = a2 = ... = an = 0,每次我会修改一个ai的值,你需要实时反馈给我 ∑1 <= i <= j <= n f(i, j)的值 mod 10007。
输入
第一行包含两个数n(1<=n<=100000)和q(1<=q<=500000)。
接下来q行,每行包含两个数i, x,代表我把ai的值改为了x。
输出
分别输出对应的答案,一个答案占一行。
#include<bits/stdc++.h>
using namespace std;
const int MOD=10007;
const int MAX=1e5+10;
struct lenka
{
int l,r,ans;
int pre,mid,suf;
}A[MAX<<2];
int a[MAX];
void build(int k,int l,int r)
{
A[k].l=l,A[k].r=r;
A[k].pre=0;
A[k].suf=0;
A[k].mid=0;
A[k].ans=0;
if(l==r)return;
build(2*k,l,(l+r)/2);
build(2*k+1,(l+r)/2+1,r);
}
void change(int k,int x,int y)
{
if(x==A[k].l&&x==A[k].r)
{
A[k].pre=y;
A[k].mid=y;
A[k].suf=y;
A[k].ans=y;
return;
}
if(x<=A[2*k].r)change(2*k,x,y);
else change(2*k+1,x,y);
A[k].pre=(A[2*k].pre+A[2*k].mid*A[2*k+1].pre%MOD)%MOD;
A[k].suf=(A[2*k+1].suf+A[2*k+1].mid*A[2*k].suf%MOD)%MOD;
A[k].mid=(A[2*k].mid*A[2*k+1].mid)%MOD;
A[k].ans=((A[2*k].ans+A[2*k+1].ans)%MOD+A[2*k].suf*A[2*k+1].pre%MOD)%MOD;
}
int main()
{
int n,T;
scanf("%d%d",&n,&T);
build(1,1,n);
while(T--)
{
int x,y;
scanf("%d%d",&x,&y);
change(1,x,y%MOD);
printf("%d\n",A[1].ans);
}
return 0;
}