| 比赛 |
进阶指南第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;
}