只有我是TLE
查看原帖
只有我是TLE
389540
imfkwk楼主2021/2/3 17:47
#include <bits/stdc++.h>
#define N 1000005

using namespace std;

int tree[4 * N];
int flag[4 * N];
int array[N];

int m, d, t = 0;

/*
void build(int node, int L, int R) {
	int ls = node << 1;
	int rs = node << 1 | 1;
	int mid = (L + R) >> 1;

	if (L == R) {
		tree[node] = array[L];
		return;
	}
	
	build(ls, L, mid);
	build(rs, mid + 1, R);
	tree[node] = min(tree[ls], tree[rs]);
}
*/

/*
void push_down(int node) {
	int ls = node << 1;
	int rs = node << 1 | 1;
	
	if (flag[node]) {
		flag[ls] += flag[node];
		flag[rs] += flag[node];
		tree[ls] += flag[node];
		tree[rs] += flag[node];
		flag[node] = 0;
	}
}
*/

void ud(int node, int L, int R, int x, int y, int k) {
	int ls = node << 1;
	int rs = node << 1 | 1;
	int mid = L + R >> 1;
	
	if (x <= L && R <= y) {
		//flag[node] += k;
		tree[node] += k;
		return;
	}
	
	//push_down(node);
	
	if (x <= mid) ud(ls, L, mid, x, y, k);
	if (y > mid) ud(rs, mid + 1, R, x, y, k);
	tree[node] = max(tree[ls], tree[rs]);
}

int query(int node, int L, int R, int x, int y) {
	int ls = node << 1;
	int rs = node << 1 | 1;
	int mid = L + R >> 1;
	
	if (L == R) {
		return tree[node];
	}
	
	int res = -2147483648;
	if (x <= mid) res = max(res, query(ls, L, mid, x, y));
	if (y > mid) res = max(res, query(rs, mid + 1, R, x, y));
	return res;
}

bool f = 1;
int ans;
int num;

int main() {
	scanf("%d%d", &m, &d);
	
	for (int i = 1; i <= m; i++) {
		char a;
		int k;
		
		cin >> a;
		if (a == 'A') {
			cin >> k;
			k = (k + t) % d;
			num++;
			ud(1, 1, m, num, num, k);
		} else if (a == 'Q') {
			cin >> k;
			t = query(1, 1, m, num - k + 1, num);
			cout << t << endl;
		}
	}
	
	return 0;
}
2021/2/3 17:47
加载中...