The number of parts is 90 points.
1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 #define N 1000001 5 #define INF 2147483647 6 #define min(a,b) (((a)<(b))?(a):(b)) 7 int n,m,a[N],sum,sz,l[8001],r[8001],minv[8001],delta[8001],num[N],x,y,v; 8 int ans,re2; 9 int Res;char C;10 inline int G()11 {12 Res=0;C=‘*‘;13 while(C<‘0‘||C>‘9‘)C=getchar();14 while(C>=‘0‘&&C<=‘9‘){Res=Res*10+(C-‘0‘);C=getchar();}15 return Res;16 }17 void makeblock()18 {19 sz=(int)sqrt((double)n*0.1); if(!sz) sz=1;20 for(sum=1;sum*sz<n;sum++)21 {22 l[sum]=r[sum-1]+1; r[sum]=sum*sz;23 minv[sum]=INF;24 for(int i=l[sum];i<=r[sum];i++) {minv[sum]=min(minv[sum],a[i]); num[i]=sum;}25 }26 l[sum]=r[sum-1]+1; r[sum]=n;27 minv[sum]=INF;28 for(int i=l[sum];i<=r[sum];i++) {minv[sum]=min(minv[sum],a[i]); num[i]=sum;}29 }30 inline void work(const int &L,const int &R)31 {32 minv[num[L]]=INF;33 for(int i=L;i<=R;i++) a[i]-=v;34 for(int i=l[num[L]];i<=r[num[L]];i++) minv[num[L]]=min(minv[num[L]],a[i]);35 }36 inline void update()37 {38 if(num[x]==num[y]) work(x,y);39 else40 {41 work(x,r[num[x]]); work(l[num[y]],y);42 for(int i=num[x]+1;i<num[y];i++) delta[i]-=v;43 }44 }45 inline int query()46 {47 ans=INF;48 if(num[x]==num[y]) {for(int i=x;i<=y;i++) ans=min(ans,a[i]+delta[num[x]]); }49 else50 {51 for(int i=x;i<=r[num[x]];i++) ans=min(ans,a[i]+delta[num[x]]);52 for(int i=num[x]+1;i<num[y];i++) ans=min(ans,minv[i]+delta[i]);53 for(int i=l[num[y]];i<=y;i++) ans=min(ans,a[i]+delta[num[y]]);54 } return ans;55 }56 int main()57 {58 n=G(); m=G();59 for(int i=1;i<=n;i++) a[i]=G();60 makeblock();61 for(int i=1;i<=m;i++)62 {63 v=G(); x=G(); y=G();64 if(query()<v)65 {66 printf("-1\n%d\n",i);67 return 0;68 }69 else update();70 }71 puts("0");72 return 0;73 }
[Partition] logu p1083 borrow classroom