首页 > 代码库 > [tem]线段树练习

[tem]线段树练习

1080 线段树练习

单点修改,区间查询和

 

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define m ((l+r)>>1)#define lson o<<1,l,m#define rson o<<1|1,m+1,r#define lc o<<1#define rc o<<1|1using namespace std;typedef long long ll;const int N=1e5+5,INF=1e9+5;inline int read(){    char c=getchar();int x=0,f=1;    while(c<0||c>9){if(c==-)f=-1;c=getchar();}    while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}    return x*f;}int n,a[N],M,op,x,y;int t[N<<2];void build(int o,int l,int r){    if(l==r) t[o]=a[l];    else{        build(lson);        build(rson);        t[o]=t[lc]+t[rc];    }}void add(int o,int l,int r,int p,int v){    if(l==r) t[o]+=v;    else{        if(p<=m) add(lson,p,v);        else add(rson,p,v);        t[o]=t[lc]+t[rc];    }}int query(int o,int l,int r,int ql,int qr){     if(ql<=l&&r<=qr) return t[o];    else{        int ans=0;        if(ql<=m) ans+=query(lson,ql,qr);        if(qr>m) ans+=query(rson,ql,qr);        return ans;    }}int main(int argc, const char * argv[]) {    n=read();    for(int i=1;i<=n;i++) a[i]=read();    build(1,1,n);    M=read();    for(int i=1;i<=M;i++){        op=read();x=read();y=read();        if(op==1){add(1,1,n,x,y);}        else {printf("%d\n",query(1,1,n,x,y));}    }    return 0;}

 



1082 线段树练习 3

区间修改,区间查询和

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define m (l+r)/2#define lson o<<1,l,m#define rson o<<1|1,m+1,r#define lc o<<1#define rc o<<1|1using namespace std;typedef long long ll;const int N=2e5+5,INF=1e9+5;inline int read(){    char c=getchar();int x=0,f=1;    while(c<0||c>9){if(c==-)f=-1;c=getchar();}    while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}    return x*f;}struct node{    ll lazy,x;}t[N<<2];int a[N];void build(int o,int l,int r){    if(l==r) t[o].x=a[l];    else{        build(lson);        build(rson);        t[o].x=t[lc].x+t[rc].x;    }}void paint(int o,int l,int r,ll delta){    t[o].lazy+=delta;    t[o].x+=delta*(r-l+1);}void pushDown(int o,int l,int r){    paint(lson,t[o].lazy);    paint(rson,t[o].lazy);    t[o].lazy=0;}void add(int o,int l,int r,int ql,int qr,ll v){    if(ql<=l&&r<=qr) paint(o,l,r,v);    else{        pushDown(o,l,r);        if(ql<=m) add(lson,ql,qr,v);        if(m<qr) add(rson,ql,qr,v);        t[o].x=t[lc].x+t[rc].x;    }}ll query(int o,int l,int r,int ql,int qr){    if(ql<=l&&r<=qr) return t[o].x;    else{        pushDown(o,l,r);        ll ans=0;        if(ql<=m) ans+=query(lson,ql,qr);        if(m<qr) ans+=query(rson,ql,qr);        return ans;    }}int n,Q,flag,l,r,x;int main(){    n=read();    for(int i=1;i<=n;i++) a[i]=read();    build(1,1,n);    Q=read();    for(int i=1;i<=Q;i++){        flag=read();        if(flag==1){            l=read();r=read();x=read();            add(1,1,n,l,r,x);        }else{            l=read();r=read();            printf("%lld\n",query(1,1,n,l,r));        }    }}

 

[tem]线段树练习