记录编号 |
328937 |
评测结果 |
AAAAAAAAAAAAAAAAATAT |
题目名称 |
[NOIP 2012]借教室 |
最终得分 |
90 |
用户昵称 |
Marvolo |
是否通过 |
未通过 |
代码语言 |
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;
- }