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; }
以上是关于codevs1081 线段树练习 2的主要内容,如果未能解决你的问题,请参考以下文章