Big Water Problem——牛客網競賽(樹狀陣列)
阿新 • • 發佈:2019-01-25
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld
題目描述
給一個數列,會有多次詢問,對於每一次詢問,會有兩種操作: 1:給定兩個整數x, y, 然後在原陣列的第x位置上加y; 2:給定兩個整數l,r,然後輸出陣列從第l位加到第r位數字的和並換行輸入描述:
第一行有兩個整數n, m(1 <= n, m <= 100000)代表數列的長度和詢問的次數 第二行n個數字,對於第i個數字a[i],(0<=a[i]<=100000)。 接下來m行,每一行有三個整數f, x, y。第一個整數f是1或者是2,代表操作型別,如果是1,接下來兩個數x,y代表第x的位置上加y,如果是2,則求x到y的和,保證資料合法。
輸出描述:
輸出每次求和的結果並換行
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[100005]; int i,j,rex,x,y,r,l,f,n,m; int lowbit(int x) { return x&-x; } void add(int n,int m){ while(n<100005) { a[n]+=m; n+=lowbit(n); } } int sum(int n){ rex=0; while(n>0) { rex+=a[n]; n-=lowbit(n); } return rex; } int main() { cin>>n>>m; memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { cin>>l; add(i,l); } for(i=1;i<=m;i++) { cin>>l>>x>>y; if(l==1) { add(x,y); } else { cout<<sum(y)-sum(x-1)<<endl; } } return 0; }