MnZn线段树求卡常
查看原帖
MnZn线段树求卡常
164302
endless_loop楼主2021/10/2 10:07
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e6+10;
int ql,qr;
struct seg{
	int minx[maxn*4],add[maxn*4];
	void maintain(int o,int L,int R){
		int lc=o*2,rc=o*2+1,mid=(L+R)/2;
		minx[o]=min(minx[lc],minx[rc])+add[o];
	}
	void pushdown(int o,int L,int R){
		int lc=o*2,rc=o*2+1,mid=(L+R)/2;
		add[lc]+=add[o];
		add[rc]+=add[o];
		add[o]=0;
		maintain(lc,L,mid);
		maintain(rc,mid+1,R);
		maintain(o,L,R);
	}
	int query(int o,int L,int R){
		int lc=o*2,rc=o*2+1,mid=(L+R)/2;
		if(ql<=L&&qr>=R)return minx[o];//!!
		int ans=1000000000;
		if(ql<=mid){
			pushdown(o,L,R);
			ans=min(query(lc,L,mid),ans);
		}
		if(qr>mid){
			pushdown(o,L,R);
			ans=min(query(rc,mid+1,R),ans);
		}
		return ans;
	}
	void update(int o,int L,int R,int v){
		int lc=o*2,rc=o*2+1,mid=(L+R)/2;
		if(ql<=L&&qr>=R){
			add[o]+=v;
			maintain(o,L,R);
			return;
		}
		if(ql<=mid)update(lc,L,mid,v);
		if(qr>mid)update(rc,mid+1,R,v);
		maintain(o,L,R);
	}
}t;
int main(){
	freopen("classroom.in","r",stdin);
	freopen("classroom.out","w",stdout);
	int n,m;
	ios::sync_with_stdio(false);
	ios::tie(false);
	cin>>n>>m;
	for(int i=1,a;i<=n;++i){
		ql=qr=i;
		cin>>a;
		t.update(1,1,n,a);
	}
	for(int i=1,v;i<=m;++i){
		cin>>v>>ql>>qr;
		if(v>t.query(1,1,n)){
			cout<<-1<<endl<<i;
			return 0;
		}
		t.update(1,1,n,-v);
	}
	cout<<0;
	return 0;
}

T 了两个点/fad

2021/10/2 10:07
加载中...