1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include <bits/stdc++.h> #define lid (tr[id].lson) #define rid (tr[id].rson) #define mid ((L+R)>>1) #define int long long using namespace std; int n,m,yu=336,rt[300036],tng[3000005],top,cqt; struct node{ int t,k,b; }nd[100005]; long long f(int id,int x){ return 1ll*nd[id].k*x+nd[id].b; } struct tree{ int id,flg,lson,rson; }tr[3000005]; void clear(int id){ tng[++top]=id; if(lid)clear(lid); if(rid)clear(rid); } int newnode(){ if(top){ tr[tng[top]]=tr[0]; return tng[top--]; } return ++cqt; } int modify(int id,int t,int L=1,int R=1e6){ if(!id){ id=newnode(); tr[id].id=t; return id; } if(f(t,mid)>f(tr[id].id,mid))swap(t,tr[id].id); if(L==R)return id; if(f(t,L)>f(tr[id].id,L))lid=modify(lid,t,L,mid); if(f(t,R)>f(tr[id].id,R))rid=modify(rid,t,mid+1,R); return id; } long long query(int id,int pos,int L=1,int R=1e6){ if(!id)return -1e18; long long ret=f(tr[id].id,pos); if(L==R)return ret; if(pos<=mid)return max(ret,query(lid,pos,L,mid)); return max(ret,query(rid,pos,mid+1,R)); } void rebuild(int id){ int l=max(1ll,id*yu),r=min(n,(id+1)*yu-1); if(rt[id])clear(rt[id]);rt[id]=0; for(int i=l;i<=r;i++){ if(nd[i].t)rt[id]=modify(rt[id],i); } } signed main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int op;scanf("%lld",&op); if(op==1){ int t,k,z,s;scanf("%lld%lld%lld%lld",&t,&k,&z,&s); nd[k].t=t,nd[k].k=z,nd[k].b=s-z*t; rebuild(k/yu); } else{ int t,a,b;scanf("%lld%lld%lld",&t,&a,&b); int bl=a/yu,br=b/yu;long long ans=-1e18;if(a>b)swap(a,b),swap(bl,br); if(bl==br){ for(int i=a;i<=b;i++)if(nd[i].t)ans=max(ans,f(i,t)); } else{ for(int i=a;i<(bl+1)*yu;i++)if(nd[i].t)ans=max(ans,f(i,t)); for(int i=br*yu;i<=b;i++)if(nd[i].t)ans=max(ans,f(i,t)); for(int i=bl+1;i<br;i++){ ans=max(ans,query(rt[i],t)); } } if(ans>-1e18)printf("%lld\n",ans); else puts("nema"); } } return 0; }
|