rt:上面的是我的代码,下面是老师的代码,蒟蒻实在看不出有什么区别
#include <bits/stdc++.h>
#define MAX 1000005
using namespace std;
long long int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
int a[MAX*4];
struct a
{
int l,r,kind;
bool ye;
} tree[MAX*4];
void build(int n,int l,int r)
{
int mid=(l+r)/2;
tree[n].l=l;tree[n].r=r;
if(l==r)
{
tree[n].ye=true;
tree[n].kind=a[l];
return;
}else{
build(n*2,l,mid);
build(n*2+1,mid+1,r);
tree[r].kind=tree[r*2].kind+tree[r*2+1].kind;
}
}
void add(int x,int k,int now)
{
int mid=(tree[now].l+tree[now].r)/2;
if(tree[now].l==tree[now].r)
{
tree[x].kind+=k;
return;
}else{
if(x>mid) add(x,k,now*2+1);else
add(x,k,now*2);
tree[now].kind=tree[now*2].kind+tree[now*2+1].kind;
}
}
long long int find(int l,int r,int n)
{
int mid=(tree[n].l+tree[n].r)/2;
if(tree[n].l==l&&tree[n].r==r)
{
return tree[n].kind;
}
if( l > mid ) return find( l , r , n * 2 + 1 );
else if( mid >= r ) return find( l , r , n * 2 );
return find( l , mid , n * 2 ) + find( mid + 1 , r , n * 2 + 1 );
}
int main()
{
int n;
cin>>n;
int x;
cin>>x;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=x;i++)
{
int a;
cin>>a;
if(a==1)
{
int x,k;
cin>>x>>k;
add(x,k,1);
}else{
int x,y;
cin>>x>>y;
cout<<find(x,y,1)<<endl;
}
}
return 0;
}
#include <iostream>
#include <stdio.h>
#define MAXN 500010
using namespace std;
int a[ MAXN ];
struct Node
{
int sum , l , r;
} segtree[ MAXN * 4 ];
void build( int x , int l , int r )
{
segtree[x].l = l , segtree[x].r = r;
if( l == r ) segtree[x].sum = a[l];
else
{
int mid = ( l + r ) / 2;
build( x * 2 , l , mid );
build( x * 2 + 1 , mid + 1 , r );
segtree[x].sum = segtree[x * 2].sum + segtree[x * 2 + 1].sum;
}
}
void update( int x , int y , int cur )
{
if( segtree[ cur ].l == segtree[ cur ].r )
{
segtree[ cur ].sum += y;
return;
}
else
{
int mid = ( segtree[ cur ].l + segtree[ cur ].r ) / 2;
if( x > mid ) update( x , y , cur * 2 + 1 );
else update( x , y , cur * 2 );
segtree[ cur ].sum = segtree[ cur * 2 ].sum + segtree[ cur * 2 + 1 ].sum;
}
}
int find( int l , int r , int cur )
{
if( l == segtree[ cur ].l && r == segtree[ cur ].r ) return segtree[ cur ].sum;
int mid = ( segtree[ cur ].l + segtree[ cur ].r ) / 2;
if( l > mid ) return find( l , r , cur * 2 + 1 );
else if( mid >= r ) return find( l , r , cur * 2 );
return find( l , mid , cur * 2 ) + find( mid + 1 , r , cur * 2 + 1 );
}
int main()
{
int n , m;
cin >> n >> m;
for( int i = 1 ; i <= n ; i++ ) cin >> a[i];
build( 1 , 1 , n );
for( int i = 1 ; i <= m ; i++ )
{
int opt , a , b;
cin >> opt >> a >> b;
if( opt == 1 ) update( a , b , 1 );
else cout << find( a , b , 1 ) << endl;
}
return 0;
}