记录编号 328937 评测结果 AAAAAAAAAAAAAAAAATAT
题目名称 [NOIP 2012]借教室 最终得分 90
用户昵称 GravatarMarvolo 是否通过 未通过
代码语言 C++ 运行时间 5.105 s
提交时间 2016-10-24 18:48:05 内存使用 34.29 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4.  
  5. int i,n,m,s,x,y;
  6. int a[500010];
  7.  
  8. struct Marvolo{int d,l,r,p,mid;}t[2000010];
  9.  
  10. inline int min(int a,int b){return (a<b)?a:b;}
  11. inline int read(){
  12. int p=0; char c=getchar();
  13. while (c<'0'||c>'9') c=getchar();
  14. while (c>='0'&&c<='9') p=p*10+c-48,c=getchar();
  15. return p;
  16. }
  17. inline void Maketree(int x,int l,int r){
  18. int Mid=(l+r)>>1;
  19. t[x].l=l; t[x].r=r; t[x].mid=Mid;
  20. if (l==r) {t[x].d=a[l]; return;}
  21. Maketree(x<<1,l,Mid); Maketree((x<<1)+1,Mid+1,r);
  22. t[x].d=min(t[x<<1].d,t[(x<<1)+1].d);
  23. }
  24. inline void Clear(int X){
  25. t[X<<1].d-=t[X].p; t[(X<<1)+1].d-=t[X].p;
  26. t[X<<1].p+=t[X].p; t[(X<<1)+1].p+=t[X].p;
  27. t[X].p=0;
  28. }
  29. inline void Insert(int x,int low,int high){
  30. if (t[x].l==low&&t[x].r==high){
  31. t[x].d-=s; t[x].p+=s; return;}
  32. if (t[x].p) Clear(x);
  33. if (high<=t[x].mid) Insert(x<<1,low,high); else
  34. if (low>t[x].mid) Insert((x<<1)+1,low,high); else{
  35. Insert(x<<1,low,t[x].mid); Insert((x<<1)+1,t[x].mid+1,high);
  36. }
  37. t[x].d=min(t[x<<1].d,t[(x<<1)+1].d);
  38. }
  39. inline void Work(){
  40. int i=0;
  41. Maketree(1,1,n);
  42. for (i=1;i<=m;i++){
  43. s=read(); x=read(); y=read();
  44. Insert(1,x,y);
  45. if (t[1].d<0) {printf("-1\n"); printf("%d\n",i); return;}
  46. }
  47. printf("0\n");
  48. }
  49.  
  50. int main(){
  51. freopen("classrooms.in","r",stdin);
  52. freopen("classrooms.out","w",stdout);
  53. n=read(); m=read();
  54. for (i=1;i<=n;i++) a[i]=read();
  55. Work();
  56. return 0;
  57. }