codevs1081 线段树练习 2

Posted 新手-周

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs1081 线段树练习 2相关的知识,希望对你有一定的参考价值。

技术分享
#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cmath>
#define inf 100000000
using namespace std;
const int maxn=100000+10;
int n,a[maxn],q;
struct Tree
{
  int val,mark;
}tree[maxn*3];
void build(int root,int arr[],int istart,int iend)
{
  if(istart==iend)
  {
    tree[root].val=arr[istart];
    return;    
  }
  int mid=(istart+iend)>>1;
  build(root<<1,arr,istart,mid);
  build(root<<1|1,arr,mid+1,iend);
  return;
}
void pushdown(int root)
{
  if(tree[root].mark)
  {
      tree[root<<1].val+=tree[root].mark;
      tree[root<<1|1].val+=tree[root].mark;
      tree[root<<1].mark+=tree[root].mark;
      tree[root<<1|1].mark+=tree[root].mark;
      tree[root].mark=0;
  }
  return;
}
void updata(int root,int ul,int ur,int nl,int nr,int val)
{
  if(ul>nr||ur<nl)return;
  if(nl>=ul&&nr<=ur)
  {
      tree[root].val+=val;
    tree[root].mark+=val;
      return;
  }
  pushdown(root);
  int mid=(nl+nr)>>1;
  updata(root<<1,ul,ur,nl,mid,val);
  updata(root<<1|1,ul,ur,mid+1,nr,val);
}
int query(int root,int ql,int qr,int nl,int nr)
{
  if(ql>nr||qr<nl)return inf;
  if(nl>=ql&&nr<=qr)return tree[root].val;
  pushdown(root);
  int mid=(nl+nr)>>1;
  return min(query(root<<1,ql,qr,nl,mid),query(root<<1|1,ql,qr,mid+1,nr));
}
int main()
{
  scanf("%d",&n);
  for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  build(1,a,1,n);
  scanf("%d",&q);
  int a,b,x,t;
  for(int i=1;i<=q;i++)
  {
      scanf("%d",&t);
      if(t==1)
      {
      scanf("%d%d%d",&a,&b,&t);
      updata(1,a,b,1,n,t);
    }
    else
    {
      scanf("%d",&a);
      printf("%d\n",query(1,a,a,1,n));
    }
  }
  return 0;
}
View Code

 

以上是关于codevs1081 线段树练习 2的主要内容,如果未能解决你的问题,请参考以下文章

CODEVS 1081 线段树练习 2 题解

codevs 1081 线段树练习 2

Codevs 1081 线段树练习2

1081 线段树练习 2

线段树模板合集(CodeVS1080 1081 1082 4597)Pascal代码

[CodeVS4919]线段树练习4