#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=1e6+5;
const ll mod=1e9+7;
ll num[M<<2],sum[M<<2];int vis[N],tmp[N];
struct Query{int op;ll a,b;}q[N];
void update(ll n,ll val,ll l,ll r,ll pos)
{
if(l==r)
{
num[pos]+=val;
sum[pos]=(sum[pos]+tmp[n]*val%mod)%mod;
return;
}
int mid=(l+r)>>1;
if(n<=mid)
update(n,val,l,mid,pos<<1);
else
update(n,val,mid+1,r,pos<<1|1);
num[pos]=num[pos<<1]+num[pos<<1|1];
sum[pos]=(sum[pos<<1]+sum[pos<<1|1])%mod;
}
ll query(ll k,ll l,ll r,ll pos)
{
if(!k)
return 0;
if(l==r)
return k*tmp[l]%mod;
int mid=(l+r)>>1;
if(k<num[pos<<1])
return query(k,l,mid,pos<<1);
else
return (sum[pos<<1]+query(k-num[pos<<1],mid+1,r,pos<<1|1))%mod;
}
int main()
{
int m,tot=0;scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%lld%lld",&q[i].op,&q[i].a,&q[i].b);
if(q[i].op==1)
tmp[++tot]=q[i].b;
}
sort(tmp+1,tmp+tot+1);
tot=unique(tmp+1,tmp+tot+1)-(tmp+1);
for(int i=1;i<=m;i++)
{
if(q[i].op==1)
{
q[i].b=(ll)(lower_bound(tmp+1,tmp+1+tot,q[i].b)-tmp);
update(q[i].b,q[i].a,1,tot,1);
}
else
printf("%lld\n",(query(q[i].b,1,tot,1)-(q[i].a==1?0:query(q[i].a-1,1,tot,1))+mod)%mod);
}
}
HDU-6464-免费送气球(线段树)
最新推荐文章于 2020-07-25 22:02:35 发布