- Description
某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票,即车上所有的旅客都有座,售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O、D、N表示,O为起始站,D为目的地站,N为车票张数,售票系统对该售票申请作出受理或不受理的决定,只有在从O到D的区段内列车上都有N个或N个以上的空座位时该售票申请才被受理,请你写一个程序,实现这个自动售票系统。
- Input
输入第一行包含三个用空格隔开的整数C、S和R,C为城市个数,S为列车上的座位数,R为所有售票申请总数。接下来的R行每行为一个售票申请,用三个由空格隔开的整数O,D和N表示,O为起始站,D为目的地站,N为车票站数,其中D<=C,1<=N<=C,所有的售票申请按申请的时间从早到晚给出。
- Output
输出共有R行,每行输出一个“YES”或“NO”,表示当前的售票申请被受理或不被受理。
- Sample Input
4 6 4
1 4 2
1 3 2
2 4 3
1 2 3
- Sample Output
YES
YES
NO
NO
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define max(x,y) ((x)>(y)?(x):(y))
#define MAXN 60010
int C,S,R;
struct node
{
int l,r,mx,change;
}arr[4*MAXN];
void Build(int l,int r,int id)
{
arr[id].l=l,arr[id].r=r,arr[id].mx=0,arr[id].change=0;
if(l==r)
return ;
int mid=(l+r)/2;
Build(l,mid,2*id);
Build(mid+1,r,2*id+1);
}
void init(int id,int x)
{
arr[id].mx+=x;
}
int search(int l,int r,int id,int require)
{
if(l==arr[id].l && arr[id].r==r)
return arr[id].mx+require<=S;
if(arr[id].change)
{
init(2*id,arr[id].change),init(2*id+1,arr[id].change);
arr[2*id].change+=arr[id].change;
arr[2*id+1].change+=arr[id].change;
arr[id].change=0;
}
int mid=(arr[id].l+arr[id].r)/2;
if(r<=mid)
return search(l,r,2*id,require);
else
if(l>mid)
return search(l,r,2*id+1,require);
else
if(l<=mid && r>mid)
return (search(l,mid,2*id,require) && search(mid+1,r,2*id+1,require));
}
void update(int l,int r,int dt,int id)
{
if(l<=arr[id].l && arr[id].r<=r)
{
arr[id].change+=dt;
arr[id].mx+=dt;
return ;
}
if(arr[id].change)
{
init(2*id,arr[id].change),init(2*id+1,arr[id].change);
arr[2*id].change+=arr[id].change;
arr[2*id+1].change+=arr[id].change;
arr[id].change=0;
}
int mid=(arr[id].l+arr[id].r)/2;
if(l<=mid)
update(l,r,dt,2*id);
if(r>mid)
update(l,r,dt,2*id+1);
arr[id].mx=max(arr[2*id].mx,arr[2*id+1].mx);
}
int main()
{
//freopen("in.txt","r",stdin);
int ll,rr,c,i;
scanf("%d %d %d",&C,&S,&R);
Build(1,C-1,1);
for(i=1;i<=R;i++)
{
scanf("%d %d %d",&ll,&rr,&c);
rr--;
if(search(ll,rr,1,c))
{
printf("YES\n");
update(ll,rr,c,1);
}
else
printf("NO\n");
}
return 0;
}