我用哈希表写了数组,但不知道为什么这样。
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int M = 4000000000000000000;
const int N = 2000000000000000000;
struct node{
int x,y;
};
struct Hash{
vector<node>v[3000005];
inline int xz001(int x){
x=(x*998244353+1000000007);
x=-x;
x=(x*333331+33331);
x=-x;
x=((x*998244353+1000000007)*1000000007+998244353)*333331+33331;
x=(x*33331+333331);
return abs(x);
}
inline void add(int x,int k){
int at=xz001(x)%3000000;
for(int i=0;i<(int)v[at].size();++i){
if(v[at][i].x==x){
v[at][i].y+=k;
return;
}
}
v[at].push_back({x,k});
return;
}
inline int query(int x){
int at=xz001(x)%3000000;
for(int i=0;i<(int)v[at].size();++i){
if(v[at][i].x==x){
return v[at][i].y;
}
}
return 0;
}
};
Hash t;
inline void add(int x,int k){
while(x<=M){
t.add(x,k);
x+=lowbit(x);
}
return;
}
inline int query(int x){
int ans=0;
while(x){
ans+=t.query(x);
x-=lowbit(x);
}
return ans;
}
int n,m;
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1,a;i<=n;i++){
scanf("%lld",&a);
add(i+N,a);
}
while(m--){
int op;
scanf("%lld",&op);
if(op==1){
int x,k;
scanf("%lld%lld",&x,&k);
x+=N;
add(x,k);
}else{
int l,r;
scanf("%lld%lld",&l,&r);
l+=N,r+=N;
printf("%lld\n",query(r)-query(l-1));
}
}
return 0;
}
不开 O2 TLE,开 O2 WA。