BZOJ3155 Preprefix sum

来源:互联网 发布:淘宝直通车玉女剑法 编辑:程序博客网 时间:2024/06/06 09:48

一个数相当于给他后边的前缀和序列加了一个等差数列

直接线段树

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<queue>#include<map>#include<bitset>#include<stack>#include<vector>#include<set>using namespace std;#define MAXN 100010#define MAXM 1010#define INF 1000000000#define MOD 1000000007#define ll long long#define eps 1e-8ll n,m;ll s[MAXN<<2],c[MAXN<<2];ll a[MAXN];void change(ll x,ll y,ll z,ll l,ll r,ll as,ll ac){if(y==l&&z==r){s[x]+=as;c[x]+=ac;return ;}ll mid=y+z>>1;if(r<=mid){change(x<<1,y,mid,l,r,as,ac);}else if(l>mid){change(x<<1|1,mid+1,z,l,r,as,ac);}else{change(x<<1,y,mid,l,mid,as,ac);change(x<<1|1,mid+1,z,mid+1,r,as+(mid-l+1)*ac,ac);}}ll ask(ll x,ll y,ll z,ll p){if(y==z){return s[x];}ll mid=y+z>>1;if(p<=mid){return s[x]+(ll)(p-y)*c[x]+ask(x<<1,y,mid,p);}else{return s[x]+(ll)(p-y)*c[x]+ask(x<<1|1,mid+1,z,p);}}int main(){ll i,x,y;scanf("%lld%lld",&n,&m);char o[10];for(i=1;i<=n;i++){scanf("%lld",&a[i]);change(1,1,n,i,n,a[i],a[i]);}while(m--){scanf("%s",o);if(o[0]=='Q'){scanf("%lld",&x);printf("%lld\n",ask(1,1,n,x));}if(o[0]=='M'){scanf("%lld%lld",&x,&y);change(1,1,n,x,n,-a[x]+y,-a[x]+y);a[x]=y;}}return 0;}/**/


0 0
原创粉丝点击