解析
当b<=sqrt(n)时,如果要更新的话,代价有点大,所以用一个数组保存当b<=sqrt(n)时的更新。当b>sqrt(n)时,暴力更新,因为复杂度不会超过sqrt(n)
然后求和的时候把b<=sqrt(n)的值更新一下就行
import java.io.BufferedReader;
import java.io.*;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Main {
static int N=100000+10;
static long []tree=new long [N<<2];
static long []temp=new long [N];
static void add(int l,int r,int x,int k,int ch) {
if(l==x&&l==r) {
tree[ch]+=k;
return ;
}
int m=(l+r)>>1;
if(x<=m) add(l,m,x,k,ch<<1);
else add(m+1,r,x,k,ch<<1|1);
tree[ch]=tree[ch<<1]+tree[ch<<1|1];
}
static long getsum(int l,int r,int L,int R,int ch) {
//System.out.println(l+" "+r+" "+tree[ch]);
if(l>=L&&r<=R) {
return tree[ch];
}
long ans=0;
int m=(l+r)>>1;
if(L<=m) ans+=getsum(l,m,L,R,ch<<1);
if(R>m) ans+=getsum(m+1,r,L,R,ch<<1|1);
return ans;
}
public static void main(String []args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
String [] s=str.split(" ");
int n=Integer.parseInt(s[0]);
int m=Integer.parseInt(s[1]);
int sq=(int) Math.sqrt((double)n)-1;
while(m--!=0) {
str=br.readLine();
s=str.split(" ");
int a=Integer.parseInt(s[0]);
int b=Integer.parseInt(s[1]);
int c=Integer.parseInt(s[2]);
if(a==1) {
if(b<=sq) {
temp[b]+=c;
}
else {
for(int i=b;i<=n;i+=b)
add(1,n,i,c,1);
}
}
else {
long ans =getsum(1,n,b,c,1);
//System.out.println(ans);
for(int i=1;i<=sq;i++) {
ans+=temp[i]*(c/i-(b-1)/i);
}
System.out.println(ans);
}
}
}
}