/*
维护区间最小值
数据不超int 相反如果long long的话会有一组数据超时
无视掉 ll int
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
#define ll int
#define inf 0x7fffffff
using namespace std;
ll n,m,num,a[maxn],falg;
struct node
{
ll lc,rc,l,r,bj,ans;
}t[maxn*];
ll init()
{
ll x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Build(ll li,ll ri)
{
ll k=++num;
t[k].l=li;t[k].r=ri;
if(li!=ri-)
{
t[k].lc=num+;
Build(li,(li+ri)/);
t[k].rc=num+;
Build((li+ri)/,ri);
t[k].ans=min(t[t[k].lc].ans,t[t[k].rc].ans);
}
else t[k].ans=a[li];
}
void update(ll k)
{
t[t[k].lc].ans-=t[k].bj;
t[t[k].rc].ans-=t[k].bj;
t[t[k].lc].bj+=t[k].bj;
t[t[k].rc].bj+=t[k].bj;
t[k].bj=;
}
void change(ll k,ll li,ll ri,ll p)
{
if(falg)return;
if(li<=t[k].l&&ri>=t[k].r)
{
t[k].ans-=p;
if(t[k].ans<)falg=;
t[k].bj+=p;
return;
}
if(t[k].bj)update(k);
if(li<(t[k].l+t[k].r)/)change(t[k].lc,li,ri,p);
if(ri>(t[k].l+t[k].r)/)change(t[k].rc,li,ri,p);
t[k].ans=min(t[t[k].lc].ans,t[t[k].rc].ans);
}
int main()
{
n=init();m=init();
for(int i=;i<=n;i++)
a[i]=init();
Build(,+n);
int x,y,z;
for(int i=;i<=m;i++)
{
falg=;
x=init();y=init();z=init();
change(,y,z+,x);
if(falg==)
{
printf("-1\n%d\n",i);
return ;
}
}
printf("0\n");
return ;
}
/*
后来听说二分快 果然快好多 - -
首先如果我们不会线段树的话 朴素的做法是对于每个询问 O(n)修改 O(n)查询
慢的很
差分这个东西可以实现O(2)的修改 O(n)还原 O(n)查询
优化一下的话 边还原边查询 这样就好多了
然后二分查询到哪一个任务
(反正考试的话我是想不到0.0)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
using namespace std;
int n,m,ans,a[maxn],s[maxn];
struct node
{
int li,ri,ti;
}p[maxn];
bool can(int x)
{
memset(s,,sizeof(s));
int sum=;
for(int i=;i<=x;i++)
{
s[p[i].li]+=p[i].ti;
s[p[i].ri+]-=p[i].ti;
}
for(int i=;i<=n;i++)
{
sum+=s[i];
if(sum>a[i])return ;
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=m;i++)
scanf("%d%d%d",&p[i].ti,&p[i].li,&p[i].ri);
int l=,r=m;
while(l<=r)
{
int mid=(l+r)/;
if(can(mid)==)
{
ans=mid;
l=mid+;
}
else r=mid-;
}
if(!ans)printf("0\n");
else printf("-1\n%d",ans);
return ;
}

最新文章

  1. Android 贝塞尔曲线库
  2. nopcommerce之一(结构分析)
  3. 转:jquery选择器总结
  4. Caffe学习系列(9):solver优化方法
  5. 如何控制Java中的线程,总结了3种方法...
  6. [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇&#183;基于C#上位机软件开发
  7. Java序列化之transient和serialVersionUID的使用
  8. [D3] 5 .rangeBands
  9. windows下安装mysql笔记
  10. 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut
  11. c语言博客作业--结构体&amp;文件
  12. 阿里云负载均衡SSL证书配置(更新)
  13. 如何阅读luajit的代码——用vs调试篇
  14. (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
  15. renren-vue 基于最新node10.8、npm6.2 在win7 x64系统 成功初始化启动
  16. 【javascript】定时器组件
  17. MYSQL 时间类型
  18. Windows7 VS2015 下编译 PythonQt3.2
  19. poj3114 Contries in War (tarjan+dijkstra)
  20. Maven运行的方式

热门文章

  1. List&lt;String^&gt;^ 引用空间
  2. bzoj2395: [Balkan 2011]Timeismoney
  3. MySQL查询优化:连接查询排序limit
  4. BZOJ 1563 诗人小G
  5. JAVA内置的观察者模式样本
  6. 大用处--PowerShell Management Library for Hyper-V.
  7. QT、QTE、qtopia区别
  8. MFC添加自定义消息
  9. 贪心 uvaoj 11134 Fabled Rooks
  10. 重新注册IE组件