32分求助
查看原帖
32分求助
1211899
Bobi2014楼主2024/7/25 16:42
#include<bits/stdc++.h>
using namespace std;
const int N = 60010;
struct node{
	int l,r,value,tag;
} tri[N * 4];
int c,s,Q;
void build(int p,int l,int r){
	tri[p].l = l;
	tri[p].r = r;
	tri[p].value = s;
	if(l == r){
		return;
	}
	int mid = (l + r) / 2;
	build(p * 2,l,mid);
	build(p * 2 + 1,mid + 1,r);
}
void revise(int p,int value){
	tri[p].value -= value;
	tri[p].tag += value;
}
void pushdown(int p){
	revise(p * 2,tri[p].tag);
	revise(p * 2 + 1,tri[p].tag);
	tri[p].value = min(tri[p * 2].value,tri[p * 2 + 1].value);
	tri[p].tag = 0;
}
void update(int p,int l,int r,int v){
	if(tri[p].l >= l and tri[p].r <= r){
		revise(p,v);
		return;
	}
	pushdown(p);
	int mid = (tri[p].l + tri[p].r) / 2;
	if(mid >= l){
		update(p * 2,l,r,v);
	}
	if(mid < r){
		update(p * 2 + 1,l,r,v);
	}
	tri[p].value = min(tri[p * 2].value,tri[p * 2 + 1].value);
}
int query(int p,int l,int r){
	if(tri[p].l >= l and tri[p].r <= r){
		return tri[p].value;
	}
	pushdown(p);
	int mid = (tri[p].l + tri[p].r) / 2,ret = INT_MAX;
	if(mid >= l){
		ret = min(ret,query(p * 2,l,r));
	}
	if(mid < r){
		ret = min(ret,query(p * 2 + 1,l,r));
	}
	return ret;
}
int main(){
	freopen("b.out","w",stdout);
	scanf("%d%d%d",&c,&s,&Q);
	build(1,1,c);
	while(Q --){
		int o,d,n;
		scanf("%d%d%d",&o,&d,&n);
		if(query(1,o,d) >= n){
			printf("T\n");
			update(1,o,d,n);
		}else{
			printf("N\n");
		}
	}
	return 0;
}
2024/7/25 16:42
加载中...