分块100,不加强一下数据吗?
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
int xx=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){
xx=xx*10+ch-'0';
ch=getchar();
}
return xx;
}
int n,m,w[1000006];
int d,s,t;
int block=1,len;
int l[1003],r[1003],mn[1003],js[1003];
int pos[1000006];
inline int min(const int &a,const int &b){
return a<b?a:b;
}
int main(){
memset(mn,0x3f,sizeof(mn));
n=rd(),m=rd();
for(int i=1;i<=n;i++)w[i]=rd();
block=len=sqrt(n);
for(int i=1;i<=len;i++){
l[i]=r[i-1]+1;r[i]=l[i]+len-1;
for(int j=l[i];j<=r[i];j++){
pos[j]=i;mn[i]=min(mn[i],w[j]);
}
}
if(r[block]<n){
++block;
l[block]=r[block-1]+1;
r[block]=n;
for(int j=l[block];j<=n;j++){
pos[j]=block;
mn[block]=min(mn[block],w[j]);
}
}
for(int i=1;i<=m;i++){
d=rd(),s=rd(),t=rd();
if(pos[s]>=pos[t]-1){
for(int j=s;j<=t;j++){
w[j]-=d;
if(w[j]-js[pos[j]]<0){
printf("-1\n%d",i);
return 0;
}
mn[pos[j]]=min(mn[pos[j]],w[j]);
}
}
else{
for(int j=s;j<=r[pos[s]];j++){
w[j]-=d;
if(w[j]-js[pos[j]]<0){
printf("-1\n%d",i);
return 0;
}
mn[pos[j]]=min(mn[pos[j]],w[j]);
}
for(int j=l[pos[t]];j<=t;j++){
w[j]-=d;
if(w[j]-js[pos[j]]<0){
printf("-1\n%d",i);
return 0;
}
mn[pos[j]]=min(mn[pos[j]],w[j]);
}
for(int j=pos[s]+1;j<=pos[t]-1;j++){
js[j]+=d;
if(js[j]>mn[j]){
printf("-1\n%d",i);
return 0;
}
}
}
}
printf("0");
return 0;
}