@俞天行 帮我
#include <bits/stdc++.h>
using namespace std;
const int N=6e4+10;
int n,m,q;
struct tree{
int sum,add;//sum为和,add为懒标记
int l,r;//保存区间
}tg[N*4];//开4倍空间
#define left x,mid
#define right mid+1,y
void build(int p,int x,int y);
void do_add(int p,int x,int y,int k);
void pushdown(int pos);
int get_sum(int p,int x,int y);
//声明函数
void build(int p,int x,int y){
tg[p].l=x,tg[p].r=y;
tg[p].sum=tg[p].add=0;
if(x>=y) return ;
int mid=x+y>>1;
//分左右区间建树
build(p<<1,left),build((p<<1)|1,right);
}
void do_add(int p,int x,int y,int k){
if(x<=tg[p].l&&tg[p].r<=y){
tg[p].sum+=k,tg[p].add+=k;
return ;
}
pushdown(p);//更新懒标记
int mid=tg[p].l+tg[p].r>>1;
if(x<=mid) do_add(p<<1,x,y,k);
if(y>mid) do_add((p<<1)|1,x,y,k);
tg[p].sum=max(tg[p<<1].sum,tg[(p<<1)|1].sum);
}
void pushdown(int pos){
if(tg[pos].add){
//如果当前节点的懒标记非空,则更新当前节点两个子节点的值和懒标记值
tg[pos<<1].sum+=tg[pos].add,tg[(pos<<1)|1].sum+=tg[pos].add;
tg[pos<<1].add+=tg[pos].add,tg[(pos<<1)|1].add+=tg[pos].add;
tg[pos].add=0;
}
return ;
}
int get_sum(int p,int x,int y){
if(x<=tg[p].l&&tg[p].r<=y) return tg[p].sum;
//[x,y]为查询区间,[tg[p].l,tg[p].r]为当前节点包含的区间,p为当前节点的编号
pushdown(p);
int ans=0,mid=tg[p].l+tg[p].r>>1;
if(x<=mid) ans=max(ans,get_sum(p<<1,x,y));
if(y>mid) ans=max(ans,get_sum((p<<1)|1,x,y));
return ans;
}
int main(){
cin>>n>>m>>q;
build(1,1,n);//建树
while(q--){
int l,r,k;
cin>>l>>r>>k;
int res=get_sum(1,l,r);
if(res+k>m)
cout<<"N"<<endl;
else{
do_add(1,l,r-1,k);
cout<<"T"<<endl;
}
}
}