program bus; const maxm=10001; maxf=1001; var a,b,t:array[0..maxm] of longint; right,s,ina,off,get,leave,d:array[0..maxf+1] of longint; p,c,n,m,k,i,j,maxk,maxi,temp:longint; reducenum:longint; function max(q,p:longint):longint; begin if q>p then exit(q); exit(p); end; function min(q,p:longint):longint; begin if q>p then exit(p); exit(q); end; begin read(n,m,k); for i:=1 to n-1 do read(D[i]); for i:=1 to m do begin read(t[i],a[i],b[i]); inc(off[b[i]]); leave[a[i]]:=max(leave[a[i]],t[i]); end; for i:=2 to n do get[i]:=max(leave[i-1],get[i-1])+D[i-1]; p:=1; for i:=1 to n do begin while((p<n)and(leave[p]<get[p]))or(p<=i)do inc(p); right[i]:=p; end; for i:=1 to n do s[i]:=s[i-1]+off[i]; while k>0 do begin maxk:=0; for i:=1 to n-1 do if (s[right[i]]-s[i]>maxk)and(d[i]>0) then begin maxk:=s[right[i]]-s[i]; maxi:=i; end; if maxk=0 then break else begin temp:=maxlongint; j:=maxi+1; while(j<n)and(leave[j]<get[j])do begin temp:=min(get[j]-leave[j],temp); inc(j); end; temp:=min(D[maxi],temp); temp:=min(k,temp); dec(k,temp); dec(D[maxi],temp); for j:=maxi+1 to right[i] do get[j]:=max(get[j-1],leave[j-1])+D[j-1]; p:=maxi; c:=off[maxi]; for j:=maxi to right[i]-1 do begin while((p<n)and(leave[p]<get[p]))or(p<=j)do inc(p); if p>=right[j] then break; right[j]:=p; end; end; end; get[1]:=leave[1]; get[n]:=max(get[n],leave[n]); for i:=1 to m do inc(reducenum,get[b[i]]-t[i]); writeln(reducenum); end. /************************************************************** Problem: 2309 User: admin Language: Pascal Result: Wrong Answer ****************************************************************/