先离线,离散化
在线段树维护区间和以及数量
#include <bits/stdc++.h>
using namespace std;
///#pragma GCC optimize(2)
#define Mode 1000000007
const int N = 1<<17;
struct node
{
long long Sum;
long long Cnt;
};
struct que
{
int type;
long long first;
long long second;
};
long long Res[1<<17];
que A[1<<17];
node dat[2*N];
long long Date[1<<17];
void Init(void)
{
for(int i = 0; i < 2*N; i++)
{
dat[i].Sum = 0;
dat[i].Cnt = 0;
}
}
void update(int k, long long a)
{
k += N-1;
dat[k].Cnt += a;
dat[k].Sum += ((Date[k-N+1]%Mode)*(a%Mode))%Mode;
while(k > 0)
{
k = k/2;
dat[k].Cnt = dat[k*2].Cnt + dat[k*2+1].Cnt;
dat[k].Sum = (dat[k*2].Sum%Mode + dat[k*2+1].Sum %Mode) %Mode;
}
}
int query(int k, long long b)
{
if(k >= N && k <= 2*N-1)
return Date[k - N+1]*b % Mode;
if(dat[k].Cnt == b)
return dat[k].Sum % Mode;
if(dat[k].Cnt < b)
{
return (dat[k].Sum%Mode + query(k*2+1, b-dat[k].Cnt)%Mode) %Mode;
}
if(dat[k].Cnt > b)
{
if(dat[k*2].Cnt >= b)
return query(k*2, b)%Mode;
else
return (dat[k*2].Sum%Mode + query(k*2+1, b-dat[k*2].Cnt)%Mode)%Mode;
}
}
int q;
int main(void)
{
freopen("G:\\data.txt", "r", stdin);
cin >> q;
int S = 0;
for(int i = 0; i < q; i++)
{
cin >> A[i].type >> A[i].first >> A[i].second;
if(A[i].type == 1)
{
Res[++S] = A[i].second;
}
}
sort(Res+1, Res+S+1);
S=unique(Res+1,Res+1+S)-(Res+1);
for(int i = 1; i <= S; i++)
{
Date[i] = Res[i]%Mode;
}
Init();
for(int i = 0; i < q; i++)
{
if(A[i].type == 1)
{
int cc = lower_bound(Res+1, Res+S+1, A[i].second) - Res;
update(cc, A[i].first);
}
else if(A[i].type == 2)
{
long long c1 = query(1, A[i].first-1)%Mode;
long long c2 = query(1, A[i].second);
long long ANS = (c2 - c1+Mode) % Mode;
cout << ANS << endl;
}
}
return 0;
}