#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define LL long long #define INF (LL)2e18 #define N 600080 LL n,m,tot,x,y,p,q,op,root,a[N*30][2],b[N*30][2],vis[N*30],ls[N*30],rs[N*30]; void cov(LL &rt,LL l,LL r,LL L,LL R,LL p,LL q){ if (rt==0) rt=++tot; if (L<=l && R>=r){ LL mid=(l+r)>>1; if (vis[rt]==0){ vis[rt]=1; a[rt][0]=p; a[rt][1]=p*(l-L)+q; return; } if (a[rt][1]>=p*(l-L)+q && a[rt][1]+a[rt][0]*(r-l)>=p*(r-L)+q) return; if (a[rt][1]<=p*(l-L)+q && a[rt][1]+a[rt][0]*(r-l)<=p*(r-L)+q){ a[rt][0]=p; a[rt][1]=p*(l-L)+q; return; } if (a[rt][1]>=p*(l-L)+q && a[rt][1]+a[rt][0]*(mid-l)>=p*(mid-L)+q){ cov(rs[rt],mid+1,r,L,R,p,q); return; } if (a[rt][1]<=p*(l-L)+q && a[rt][1]+a[rt][0]*(mid-l)<=p*(mid-L)+q){ cov(rs[rt],mid+1,r,l,r,a[rt][0],a[rt][1]); a[rt][0]=p; a[rt][1]=p*(l-L)+q; return; } if (a[rt][1]+a[rt][0]*(mid+1-l)>=p*(mid+1-L)+q && a[rt][0]*(r-l)+a[rt][1]>=p*(r-L)+q){ cov(ls[rt],l,mid,L,R,p,q); return; } if (a[rt][1]+a[rt][0]*(mid+1-l)<=p*(mid-1-L)+q && a[rt][0]*(r-l)+a[rt][1]<=p*(r-L)+q){ cov(ls[rt],l,mid,l,r,a[rt][0],a[rt][1]); a[rt][0]=p; a[rt][1]=p*(l-L)+q; return; } return; } LL mid=(l+r)>>1; if (L<=mid) cov(ls[rt],l,mid,L,R,p,q); if (R>mid) cov(rs[rt],mid+1,r,L,R,p,q); } void add(LL &rt,LL l,LL r,LL L,LL R,LL p,LL q){ if (rt==0) rt=++tot; if (L<=l && R>=r){ b[rt][0]+=p; b[rt][1]+=(l-L)*p+q; return; } LL mid=(l+r)>>1; if (L<=mid) add(ls[rt],l,mid,L,R,p,q); if (R>mid) add(rs[rt],mid+1,r,L,R,p,q); } LL query1(LL rt,LL l,LL r,LL x){ if (l==r){if (!vis[rt]) return -INF;return a[rt][1];} LL mid=(l+r)>>1,tmp=vis[rt]?a[rt][0]*(x-l)+a[rt][1]:-INF; if (x<=mid) return max(tmp,query1(ls[rt],l,mid,x)); if (x>mid) return max(tmp,query1(rs[rt],mid+1,r,x)); return -INF; } LL query2(LL rt,LL l,LL r,LL x){ if (l==r) return b[rt][1]; LL mid=(l+r)>>1; if (x<=mid) return b[rt][0]*(x-l)+b[rt][1]+query2(ls[rt],l,mid,x); if (x>mid) return b[rt][0]*(x-l)+b[rt][1]+query2(rs[rt],mid+1,r,x); return -INF; } int main(){ scanf("%lld%lld",&n,&m); for (LL i=1;i<=m;i++){ scanf("%lld",&op); if (op==1){ scanf("%lld%lld%lld%lld",&x,&y,&p,&q); cov(root,1,n,x,y,p,q); } if (op==2){ scanf("%lld%lld%lld%lld",&x,&y,&p,&q); add(root,1,n,x,y,p,q); } if (op==3){ scanf("%lld",&x); p=query1(root,1,n,x); q=query2(root,1,n,x); if (p==-INF) puts("NA"); else printf("%lld\n",p+q); } } return 0; }
|