标签:区间查询 sed names 个数 void node 线段树 oid 输出
#include <iostream> using namespace std; #define Max 100005 struct node { int l,r,w,f; }tree[4*Max+1]; int x,ans,y,a,b; void build(int k,int l,int r) { tree[k].l=l,tree[k].r=r; if(l==r) { scanf("%d",&tree[k].w); return; } int mid=(l+r)/2; build(k*2,l,mid); build(k*2+1,mid+1,r); tree[k].w=tree[2*k].w+tree[2*k+1].w; }//建树 void down(int k) { tree[k*2].f+=tree[k].f; tree[k*2+1].f+=tree[k].f; tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1); tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1); tree[k].f=0; } //标记下传 void ask_point(int k) { if(tree[k].l==tree[k].r) { ans=tree[k].w; return ; } if(tree[k].f) down(k); int m=(tree[k].l+tree[k].r)/2; if(x<=m) ask_point(k*2); else ask_point(k*2+1); }//单点查询 void change_point(int k) { if(tree[k].l==tree[k].r) { tree[k].w+=y; return; } if(tree[k].f) down(k); int m=(tree[k].l+tree[k].r)/2; if(x<=m) change_point(k*2); else change_point(k*2+1); tree[k].w=tree[k*2].w+tree[k*2+1].w; } void ask_interval(int k) { if(tree[k].l>=a&&tree[k].r<=b) { ans+=tree[k].w; return; } if(tree[k].f) down(k); int m=(tree[k].l+tree[k].r)/2; if(a<=m) ask_interval(k*2); if(b>m) ask_interval(k*2+1); }//区间查询 void change_interval(int k) { if(tree[k].l>=a&&tree[k].r<=b) { tree[k].w+=(tree[k].r-tree[k].l+1)*y; tree[k].f+=y; return; } if(tree[k].f) down(k); int m=(tree[k].l+tree[k].r)/2; if(a<=m) change_interval(k*2); if(b>m) change_interval(k*2+1); tree[k].w=tree[k*2].w+tree[k*2+1].w; }//区间修改 int main() { int n,m,p; cin>>n; build(1,1,n); scanf("%d",&m); //m种操作 for(int i=1;i<=m;i++) { scanf("%d",&p); ans=0; if(p==1) { scanf("%d",&x); ask_point(1);//单点查询,输出第x个数 printf("%d",ans); } else if(p==2) { scanf("%d%d",&x,&y); change_point(1);//单点修改 } else if(p==3) { scanf("%d%d",&a,&b);//区间查询 ask_interval(1); printf("%d\n",ans); } else { scanf("%d%d%d",&a,&b,&y);//区间修改 change_interval(1); } } }
标签:区间查询 sed names 个数 void node 线段树 oid 输出
原文地址:https://www.cnblogs.com/ww123/p/9569092.html