RT,已经调一晚上加一上午了。有无大佬救救窝/kel
顺便问一句,线段树题有什么好的调试技巧吗,现在总是一调题就好几个小时还越调越错/ll
#include<bits/stdc++.h>
#define ls now<<1
#define rs now<<1|1
#define int long long
using namespace std;
typedef long long ll;
const ll N=5e5+5;
ll n,m,a[N],s[N],d[N],b[N];
struct node{
ll sum,maxn;
}tr[N<<2];
ll lzh[N<<2],lzt[N<<2];
void build(ll now,ll l,ll r)
{
if(l==r)
{
tr[now].sum=tr[now].maxn=0;
return;
}
ll mid=(l+r)>>1;
build(ls,l,mid);build(rs,mid+1,r);
tr[now].sum=tr[ls].sum+tr[rs].sum;
tr[now].maxn=tr[rs].maxn;
}
void push_down(ll now,ll l,ll r)
{
ll mid=(l+r)>>1;
if(lzh[now]!=-1)
{
lzh[ls]=lzh[now];lzh[rs]=lzh[now];
tr[ls].sum=lzh[ls]*(mid-l+1);tr[rs].sum=lzh[rs]*(r-mid);
lzt[ls]=lzt[rs]=0;
tr[ls].maxn=lzh[ls]; tr[rs].maxn=lzh[rs];
lzh[now]=-1;
}
if(lzt[now])
{
lzt[ls]+=lzt[now];lzt[rs]+=lzt[now];
tr[ls].sum+=(s[mid]-s[l-1])*lzt[now];tr[ls].maxn+=a[mid]*lzt[now];
tr[rs].sum+=(s[r]-s[mid])*lzt[now];tr[rs].maxn+=a[r]*lzt[now];
lzt[now]=0;
}
}
void modify(ll now,ll l,ll r,ll ml,ll mr,ll h)
{
if(l==ml&&r==mr)
{
lzh[now]=h;
tr[now].sum=(r-l+1)*h;
tr[now].maxn=h;
return;
}
ll mid=(l+r)>>1;
push_down(now,l,r);
if(mr<=mid) modify(ls,l,mid,ml,mr,h);
else if(ml>mid) modify(rs,mid+1,r,ml,mr,h);
else
{
modify(ls,l,mid,ml,mid,h);
modify(rs,mid+1,r,mid+1,mr,h);
}
tr[now].sum=tr[ls].sum+tr[rs].sum;
tr[now].maxn=max(tr[ls].maxn,tr[rs].maxn);
}
ll find(ll now,ll l,ll r,ll h)
{
ll mid=(l+r)>>1;
if(l==r) return l;
push_down(now,l,r);
if(tr[ls].maxn>=h) return find(ls,l,mid,h);
return find(rs,mid+1,r,h);
}
ll query(ll now,ll l,ll r,ll ml,ll mr)
{
if(l==ml&&r==mr) return tr[now].sum;
ll mid=(l+r)>>1;
push_down(now,l,r);
if(mr<=mid) return query(ls,l,mid,ml,mr);
if(ml>mid) return query(rs,mid+1,r,ml,mr);
return query(ls,l,mid,ml,mid)+query(rs,mid+1,r,mid+1,mr);
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
sort(a+1,a+n+1);
for(ll i=1;i<=n;i++) s[i]=s[i-1]+a[i];
memset(lzh,-1,sizeof(lzh));
for(ll i=1;i<=m;i++)
{
scanf("%lld%lld",&d[i],&b[i]);
lzt[1]+=d[i]-d[i-1];
tr[1].sum+=s[n]*lzt[1];
tr[1].maxn+=a[n]*lzt[1];
push_down(1,1,n);
ll w=find(1,1,n,b[i]);
if(tr[1].maxn<=b[i])
{
cout<<"0"<<endl;
continue;
}
if(query(1,1,n,w,n)-(n-w+1)*b[i]<0) cout<<"0"<<endl;
else cout<<(ll)(query(1,1,n,w,n)-(n-w+1)*b[i])<<endl;
modify(1,1,n,w,n,b[i]);
}
return 0;
}
/*
4 2
1 2 4 3
1 1
2 2
*/