Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define fast ios_base::sync_with_stdio(0);cin.tie(NULL);cout.tie(NULL)
- #define ll long long
- #define ld long double
- #define pb push_back
- #define fe first
- #define se second
- #define st(x) sort(x.begin(),x.end())
- #define rst(x) sort(x.rbegin(),x.rend())
- const long double pi = 3.14159265358979323;
- const double EPS = 1e-12;
- const int N = 1e6 + 5;
- const int mod = 998244353;
- //segment tree
- ll tree[N ] , a[N];
- void build(ll node , ll start , ll end )
- {
- if(start == end)
- {
- tree[node] = a[start];
- return;
- }
- ll mid = (start + end)/2;
- build(2*node , start , mid);
- build(2*node + 1 , mid + 1 , end);
- tree[node] = tree[2*node] + tree[2*node + 1];
- }
- void update(ll node , ll start , ll end , ll idx , ll val)
- {
- if(start == end)
- {
- a[idx] += val;
- tree[node] += val;
- return;
- }
- else
- {
- ll mid = (start + end)/2;
- if(idx >= start and idx <= mid)
- update(2*node , start , mid , idx , val);
- else
- update(2*node + 1 , mid + 1 , end , idx , val);
- tree[node] = tree[2*node] + tree[2*node + 1];
- }
- }
- int query(ll node , ll start , ll end , ll l , ll r)
- {
- if(r < start or l > end)
- return 0;
- else if(start >= l and end <= r)
- return tree[node];
- ll mid = (start + end)/2;
- ll p1 = query(2*node , start , mid , l , r);
- ll p2 = query(2*node + 1 , mid + 1 , end , l , r);
- return p1 + p2;
- }
- int main()
- {
- fast;
- ll n ;
- cin >> n ;
- for(int i = 1 ; i <= n ; i++)
- cin >> a[i];
- ll m , l , r, ch , idx , val;
- build(1 ,1 , n );
- cin >> m ;
- while(m--)
- {
- cin >> ch;
- if(ch){
- cin >> l >> r ;
- cout << query(1 , 1 , n , l , r) << "\n";
- }
- else{
- cin >> idx >> val;
- update(1 , 1 ,n , idx ,val);
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment