求助线段树,样例都没过
查看原帖
求助线段树,样例都没过
283742
liusizhe楼主2021/8/19 12:08

萌新刚学线段树,本题样例都没过,请dalao帮看一下,谢谢。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5e5;
int tree[4*N],a[N];
int n,m;


inline int read()
{
  char ch=getchar();
  int x=0,f=1;
  while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
  return x*f;
}

void build(int k,int l,int r)
{
  if(l==r) {tree[k]=a[l];return ;}
  int mid=(l+r)>>1;
  build(k*2,l,mid);
  build(k*2+1,mid+1,r);
  tree[k]=tree[k*2]+tree[k*2+1];
  return ;
}

void change(int k,int l,int r,int x,int v)
{
  if(r<x||l>x) return ;
  if(l==r&&l==x) {tree[l]+=v;return ;}
  int mid=(l+r)>>1;
  change(k*2,l,mid,x,v);
  change(k*2+1,mid+1,r,x,v);
  tree[k]=tree[k*2]+tree[k*2+1];
  return;
}

int  query(int k,int l,int r,int x,int y)
{
  if(r<x||l>y) return 0;
  if(x<=l&&y>=r) return tree[k];
  int mid=(l+r)>>1;
  return query(k*2,l,mid,x,y)+query(k*2+1,mid+1,r,x,y);
}

int main()
{
  n=read(),m=read();
  for(int i=1;i<=n;i++) a[i]=read();
  build(1,1,n);  
  for(int i=1;i<=m;i++)
  {
    int p,x,y;
    p=read(),x=read(),y=read();
    if(p==1) change(1,1,n,x,y);
    else cout<<query(1,1,n,x,y)<<endl;
  }
  return 0;
}
2021/8/19 12:08
加载中...