码迷,mamicode.com
首页 > 其他好文 > 详细

codevs1081 线段树练习 2

时间:2017-10-27 23:05:06      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:isp   build   code   art   one   练习   data   inf   ++   

技术分享
#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

标签:isp   build   code   art   one   练习   data   inf   ++   

原文地址:http://www.cnblogs.com/new-hand/p/7745511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!