MnZn求助树状数组
查看原帖
MnZn求助树状数组
366254
dxy2020楼主2022/4/29 13:16

rt,40pts

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
#define int long long
using namespace std;
inline void in(int &x){
	int f=1;x=0;char c=getchar();
	while (c>'9'||c<'0'){if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	x*=f;
}
int n,m,l,r,x,k;
int Tree[100005],Tree1[100005],a[100005];
string op; 
inline int lowbit (int x){
	return x&(-x);
}
inline void update (int x,int k){
	while (x<=n){
		Tree[x]+=k;
		x+=lowbit(x);
	}
}
inline void update1 (int x,int k){
	while (x<=n){
		Tree1[x]+=k;
		x+=lowbit(x);
	}
}
inline int query (int x){
	int ans=0;
	while (x){
		ans+=Tree[x];
		x-=lowbit(x);
	}
	return ans;
}
inline int query1 (int x){
	int ans=0;
	while (x){
		ans+=Tree1[x];
		x-=lowbit(x);
	}
	return ans;
}
signed main(){
	in (n);in (m);
	for (int i=1;i<=n;++i){
		in (a[i]);update (i,a[i]);
		update1 (i,i*a[i]);
	}
	for (int i=1;i<=m;++i){
		cin>>op;
		if (op=="Modify"){
			in (x);in (k);
			update (x,k-a[x]);
			update1 (x,(k-a[x])*x);
		}
		if (op=="Query"){
			in (r);
			printf ("%lld\n",(r+1)*query (r)-query1 (r));
		}
	}
	return 0;
}

2022/4/29 13:16
加载中...