记录编号 |
345909 |
评测结果 |
WWWWWWWAWWWWWWWWWTTT |
题目名称 |
[NOIP 2012]借教室 |
最终得分 |
5 |
用户昵称 |
AntiLeaf |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
6.488 s |
提交时间 |
2016-11-11 19:38:04 |
内存使用 |
6.23 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1050010;
void madd(int,int,int);
int qmin(int,int);
int n,M=1,m,l,r,d,mn[maxn<<1]={0};
int main(){
#define MINE
#ifdef MINE
freopen("classrooms.in","r",stdin);
freopen("classrooms.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
while(M<n+2)M<<=1;
for(int i=1;i<=n;i++)scanf("%d",&mn[i+M]);
for(int i=M-1;i;i--){
mn[i]=max(mn[i<<1],mn[i<<1|1]);
mn[i<<1]-=mn[i];mn[i<<1|1]-=mn[i];
}
int i=1;
for(;i<=m;i++){
scanf("%d%d%d",&d,&l,&r);
madd(l,r,-d);
if(qmin(l,r)<0)break;
}
if(i>m)printf("0");
else printf("-1\n%d",i);
#ifndef MINE
printf("\n-------------------------DONE-------------------------\n");
for(;;);
#endif
return 0;
}
void madd(int l,int r,int d){
int a;
for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){
if(~l&1)mn[l^1]+=d;
if(r&1)mn[r^1]+=d;
a=max(mn[l],mn[l^1]);mn[l]-=a;mn[l^1]-=a;mn[l>>1]+=a;
a=max(mn[r],mn[r^1]);mn[r]-=a;mn[r^1]-=a;mn[r>>1]+=a;
}
}
int qmin(int l,int r){
int lans=0,rans=0;
for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){
lans+=mn[l];rans+=mn[r];
if(~l&1)lans=min(lans,mn[l^1]);
if(r&1)rans=min(rans,mn[r^1]);
}
lans=min(lans,rans);
while(l^1)lans+=mn[l>>=1];
return lans;
}