比赛 进阶指南第0章测试 评测结果 MMMMMMMMMMMMMMMMMMMM
题目名称 借教室 最终得分 0
用户昵称 小福鑫 运行时间 0.017 s
代码语言 C++ 内存使用 1.32 MiB
提交时间 2026-03-14 11:10:32
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,x,y,d,s,t;
struct t{
	int lc,rc,mn,f;
}tr[10000001];
void up(int k){tr[k].mn=min(tr[k*2].mn,tr[k*2+1].mn);}
void pd(int k){
	tr[k*2].f+=tr[k].f;
	tr[k*2+1].f+=tr[k].f;
	tr[k*2].mn+=tr[k].f;
	tr[k*2+1].mn+=tr[k].f;
	tr[k].f=0;
	return;
}
void build(int k,int l,int r){
	tr[k].lc=l;tr[k].rc=r;
	tr[k].f=0;
	if(l==r){
	    cin>>tr[k].mn;
		return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	up(k);
}
void change(int k,int l,int r){
	if(tr[k].lc==l&&tr[k].rc==r){
		tr[k].f+=d;
		tr[k].mn+=d;
		return;
	}
	if(tr[k].f) pd(k);
	int mid=(tr[k].lc+tr[k].rc)/2;
	if(l<=mid&&mid<r) change(k*2,l,mid),change(k*2+1,mid+1,r);
	else if(r<=mid) change(k*2,l,r);
	else change(k*2+1,l,r);
	up(k);
}
int query(int k,int l,int r){
	if(tr[k].lc==l&&tr[k].rc==r)return tr[k].mn;
	if(tr[k].f!=0) pd(k);
	int mid=(tr[k].lc+tr[k].rc)/2;
	if(l<=mid&&mid<r) return min(query(k*2,l,mid),query(k*2+1,mid+1,r));
	else if(r<=mid) return query(k*2,l,r);
	else return query(k*2+1,l,r);
}
signed main(){
    freopen("classrooms.in","r",stdin);
    freopen("classrooms.out","w",stdout);
	cin>>n;
	build(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++){
	    cin>>d>>s>>t;
	    d=-d;
	    change(1,s,t);
	    if(query(1,s,t)<0){
	        cout<<-1<<"\n"<<i;
	        return 0;
        }
	}
	cout<<0;
	return 0;
}