记录编号 328937 评测结果 AAAAAAAAAAAAAAAAATAT
题目名称 [NOIP 2012]借教室 最终得分 90
用户昵称 GravatarMarvolo 是否通过 未通过
代码语言 C++ 运行时间 5.105 s
提交时间 2016-10-24 18:48:05 内存使用 34.29 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;

int i,n,m,s,x,y;
int a[500010];

struct Marvolo{int d,l,r,p,mid;}t[2000010];

inline int min(int a,int b){return (a<b)?a:b;}
inline int read(){
	int p=0; char c=getchar();
	while (c<'0'||c>'9')  c=getchar();
	while (c>='0'&&c<='9')	p=p*10+c-48,c=getchar();
	return p;
}
	inline void Maketree(int x,int l,int r){
		int Mid=(l+r)>>1;
		t[x].l=l;	t[x].r=r;	t[x].mid=Mid;
		if (l==r)	{t[x].d=a[l]; return;}
		Maketree(x<<1,l,Mid);	Maketree((x<<1)+1,Mid+1,r);
		t[x].d=min(t[x<<1].d,t[(x<<1)+1].d);
	}
	inline void Clear(int X){
		t[X<<1].d-=t[X].p;	t[(X<<1)+1].d-=t[X].p;
		t[X<<1].p+=t[X].p;	t[(X<<1)+1].p+=t[X].p;
		t[X].p=0;
	}
	inline void Insert(int x,int low,int high){
		if (t[x].l==low&&t[x].r==high){
			t[x].d-=s;	t[x].p+=s;	return;}
		if (t[x].p)	Clear(x);
		if (high<=t[x].mid)	Insert(x<<1,low,high);	else
		if (low>t[x].mid)	Insert((x<<1)+1,low,high);	else{
			Insert(x<<1,low,t[x].mid);	Insert((x<<1)+1,t[x].mid+1,high);
		}
		t[x].d=min(t[x<<1].d,t[(x<<1)+1].d);
	}
inline void Work(){
	int i=0;
	Maketree(1,1,n);
	for (i=1;i<=m;i++){
		s=read();	x=read();	y=read();
		Insert(1,x,y);
		if (t[1].d<0)	{printf("-1\n"); printf("%d\n",i);	return;}
	}
	printf("0\n");
}

int main(){
	freopen("classrooms.in","r",stdin);
	freopen("classrooms.out","w",stdout);
	n=read();	m=read();
	for (i=1;i<=n;i++)	a[i]=read();
	Work();
	return 0;
}