比赛完玩了一天游戏(颓~)

看到有人要这题的标程,贴一下吧(除了会贴标程你还会干吗~)~

//-----------------

类型:线段树


标程:

#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

#define lson l , mid , rt << 1
#define rson mid + 1 , r , rt << 1 | 1
const int maxn = 11111;
const int maxk = 12;

int add[maxn<<2];
int MAX[maxk][maxn<<2];
int need[maxk];
int n , K;
void pushDown(int rt) {
	if (add[rt]) {
		add[rt<<1] += add[rt];
		add[rt<<1|1] += add[rt];
		for (int i = 1 ; i <= K ; i ++) {
			if (MAX[i][rt<<1] != -1) MAX[i][rt<<1] += add[rt] * i;
			if (MAX[i][rt<<1|1] != -1) MAX[i][rt<<1|1] += add[rt] * i;
		}
		add[rt] = 0;
	}
}
void pushUp(int rt) {
	for (int i = 1 ; i <= K ; i ++) {
		MAX[i][rt] = max(MAX[i][rt<<1] , MAX[i][rt<<1|1]);
	}
}
void levelUp(int i,int l,int r,int rt) {
	if (l == r) {
		while (i < K) {
			if (MAX[i][rt] < need[i]) break;
			MAX[i+1][rt] = MAX[i][rt];
			MAX[i][rt] = -1;
			i ++;
		}
		return ;
	}
	pushDown(rt);
	int mid = (l + r) >> 1;
	if (MAX[i][rt<<1] >= need[i]) levelUp(i , lson);
	if (MAX[i][rt<<1|1] >= need[i]) levelUp(i , rson);
	pushUp(rt);
}
void update(int L,int R,int c,int l,int r,int rt) {
	if (L <= l && r <= R) {
		add[rt] += c;
		for (int i = K ; i >= 1 ; i --) {
			if (MAX[i][rt] != -1) MAX[i][rt] += c * i;
			if (i < K && MAX[i][rt] >= need[i]) {
				levelUp(i , l , r , rt);
			}
		}
		return ;
	}
	pushDown(rt);
	int mid = (l + r) >> 1;
	if (L <= mid) update(L , R , c , lson);
	if (mid < R) update(L , R , c , rson);
	pushUp(rt);
}
int query(int L,int R,int l,int r,int rt) {
	if (L <= l && r <= R) {
		for (int i = K ; i >= 1 ; i --) {
			if (MAX[i][rt] != -1) return MAX[i][rt];
		}
	}
	pushDown(rt);
	int mid = (l + r) >> 1;
	int ret = 0;
	if (L <= mid) ret = max(ret , query(L , R , lson));
	if (mid < R) ret = max(ret , query(L , R , rson));
	return ret;
}
int main() {
	freopen("level.in","r",stdin);
	freopen("level.out","w",stdout);
	int T , cas = 1;
	scanf("%d",&T);
	while (T --) {
		int Q;
		scanf("%d%d%d",&n,&K,&Q);
		for (int i = 1 ; i < K ; i ++) scanf("%d",&need[i]);

		memset(add , 0 , sizeof(add));
		memset(MAX[1] , 0 , sizeof(MAX[1]));

		for (int i = 2 ; i <= K ; i ++) {
			memset(MAX[i] , -1 , sizeof(MAX[i]));
		}
		printf("Case %d:\n" , cas ++);
		while (Q --) {
			char op[2];
			int a , b , c;
			scanf("%s",op);
			if (op[0] == 'W') {
				scanf("%d%d%d",&a,&b,&c);
				update(a , b , c , 1 , n , 1);
			} else {
				scanf("%d%d",&a,&b);
				printf("%d\n" , query(a , b , 1 , n , 1));
			}
		}
		puts("");
	}
	return 0;
}