問題の解
线段树模板往上一打……T了一个点……不过o2可以AC……
问题是在比赛中我感觉我会懒得手打线段树……
セグメント ツリー コード:
#include<bits/stdc++.h>
#define ll long long
#define mid ((L+R)>>1)
#define ls (o<<1)
#define rs ((o<<1)+1)
#define len (R-L+1)
using namespace std;
inline int read()
{
char c=getchar();int x=0;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
x=x*10+c-'0';
return x;
}
const int N=1e6+5;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n,m,pre_r[N];
ll l, r, dlt;
ll a[N], mini[N << 1], tag[N << 1];
inline void push_up(ll o)
{
mini[o]=min(mini[ls],mini[rs]);
}
void construct(ll o, ll L, ll R)
{
tag[o] = 0;
if (L == R)
{
mini[o]=a[L];
return;
}
construct(ls, L, mid);
construct(rs, mid + 1, R);
push_up(o);
}
inline void ff(ll o, ll L, ll R,ll d)
{
tag[o] += d;
mini[o]+=d;
}
inline void push_down(ll o, ll L, ll R)
{
ff(ls, L, mid,tag[o]);
ff(rs, mid + 1, R,tag[o]);
tag[o] = 0;
}
void update(ll o, ll L, ll R)
{
if (l <= L && R <= r)
{
tag[o] += dlt;
mini[o]+=dlt;
return;
}
push_down(o, L, R);
if (l <= mid)update(ls, L, mid);
if (r > mid)update(rs, mid + 1, R);
push_up(o);
}
ll query(ll o, ll L, ll R)
{
if (l <= L && R <= r)
{
return mini[o];
}
ll res = INF;
push_down(o, L, R);
if (l <= mid)
res=min(res,query(ls, L, mid));
if (r > mid)
res=min(res,query(rs, mid + 1, R));
push_up(o);
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)a[i]=read();
construct(1,1,n);
bool flag=0;
for(int i=1;i<=m;i++)
{
ll d=read();
l=read();
r=read();
ll cur_mini=query(1,1,n);
if(cur_mini<d)
{
cout<<"-1"<<endl<<i;
flag=1;
break;
}
dlt=-d;
update(1,1,n);
}
if(flag==0)cout<<0;
return 0;
}