线段树5pts求助
查看原帖
线段树5pts求助
843293
D2019ly楼主2022/10/25 16:13
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
typedef long long ll;
#define int long long
int n,m,R;
int jie[1000005];
struct did{
	int d,s,t;
}a[1000005];


struct tree{
	int lz,sum,l,r;	
}tr[1000005*4];

inline void pushup(int p)
{
	tr[p].sum=min(tr[p<<1].sum,tr[p<<1|1].sum);
}
inline void build(int p,int l,int r)
{
	tr[p].l=l;tr[p].r=r;
	if(l==r)
	{
		cin>>R;
		tr[p].sum=R;
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
inline void pushdown(int p)
{
	if(!tr[p].lz)return ;
	tr[p<<1].sum-=tr[p].lz;
	tr[p<<1|1].sum-=tr[p].lz;
	tr[p<<1].lz+=tr[p].lz;
	tr[p<<1|1].lz+=tr[p].lz;	
		
	tr[p].lz=0;
}
inline void modify(int p,int l,int r,int add)
{
	if(l<=tr[p].l&&tr[p].r<=r)
	{
		tr[p].sum-=add;
		tr[p].lz+=add;
		return ;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(l<=mid)modify(p<<1,l,r,add);
	if(r>mid)modify(p<<1|1,l,r,add);
	pushup(p);
}
inline int query(int p,int l,int r)
{
	if(l<=tr[p].l&&tr[p].r<=r)return tr[p].sum;
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	int minn=123456789;
	if(l<=mid)minn=min(minn,query(p<<1,l,r));
	if(r>mid)minn=min(minn,query(p<<1|1,l,r));
	return minn;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	

	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		cin>>a[i].d>>a[i].s>>a[i].t;	
		/*for(int j=a[i].s;j<=a[i].t;j++)//SEGMENT TREE?
		{
			jie[j]+=a[i].d;
			if(jie[j]>r[j])
			{
				cout<<-1<<endl;
				cout<<i<<endl;
				return 0;
			}
		}*/
		if(query(1,a[i].s,a[i].t)<a[i].d)
		{
			cout<<-1<<endl;
			cout<<i<<endl;
			return 0;
		}
		modify(1,a[i].s,a[i].t,a[i].d);
		
	}	
	
	cout<<0<<endl;
	
	
	
	return 0;
}
2022/10/25 16:13
加载中...