Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

树状数组

Posted by zby1234 at 2013-05-20 11:01:00 on Problem 3468
#include <cstdio>
const int MAXN = 100000;
template <class T>
class fenwick
{
	public:
	T a[MAXN + 1], b[MAXN + 1];
	int lowbit(int x) { return x & (-x); }
	void update_a(int pos, T val)
	{
		for (int i = pos; i >= 1; i -= lowbit(i))
			a[i] += val;
	}
	void update_b(int pos, T val)
	{
		for (int i = pos; i <= MAXN; i += lowbit(i))
			b[i] += val;
	}
	T query_a(int pos)
	{
		T ret = 0;
		for (int i = pos; i <= MAXN; i += lowbit(i))
			ret += a[i];
		return ret;
	}
	T query_b(int pos)
	{
		T ret = 0;
		for (int i = pos; i >= 1; i -= lowbit(i))
			ret += b[i];
		return ret;
	}
	void add(int pos, T val) { update_a(pos, val); update_b(pos, val * pos); }
	T query(int pos) { return query_a(pos) * pos + query_b(pos - 1); }
	void add(int l, int r, T val) { add(r, val); if (l > 1) add(l - 1, -val); }
	T query(int l, int r) { return query(r) - (l > 1 ? query(l - 1) : 0); }
};
int main()
{
	static fenwick<long long> tree;
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		int val;
		scanf("%d", &val);
		tree.add(i, i, val);
	}
	for (int i = 1; i <= m; i++)
	{
		char op[2];
		scanf("%s", op);
		if (op[0] == 'C')
		{
			int l, r, val;
			scanf("%d%d%d", &l, &r, &val);
			tree.add(l, r, val);
		}
		else if (op[0] == 'Q')
		{
			int l, r;
			scanf("%d%d", &l, &r);
			printf("%I64d\n", tree.query(l, r));
		}
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator