线段树区间求和

来源:互联网 发布:java kafka offset 编辑:程序博客网 时间:2024/05/16 18:41

题目:点击打开链接

代码:

program pro;var        tree:array[0..400000]of record a,b,l,r,lz:longint; sum:int64;  end;        nn:array[0..200000]of longint;        n,m,order,a,b,c,tot,i,j:longint;procedure  maketree(l,r:longint);var        mid,now:longint;begin        inc(tot);        now:=tot;        tree[now].a:=l; tree[now].b:=r;        if l=r then        begin                tree[now].sum:=nn[l];                exit;        end;        mid:=(l+r)shr 1;        tree[now].l:=tot+1;        maketree(l,mid);        tree[now].r:=tot+1;        maketree(mid+1,r);        tree[now].sum:=tree[tree[now].l].sum+tree[tree[now].r].sum;end;procedure gx(num:longint);begin        with tree[num] do        begin                inc(tree[l].lz,lz);                inc(tree[r].lz,lz);                inc(tree[l].sum,(tree[l].b-tree[l].a+1)*lz);                inc(tree[r].sum,(tree[r].b-tree[r].a+1)*lz);                lz:=0;        end;end;procedure add(num,l,r,c:longint);var        mid:int64;begin        if tree[num].lz<>0 then gx(num);        if (l<=tree[num].a)and(tree[num].b<=r) then        begin                inc(tree[num].lz,c);                inc(tree[num].sum,(tree[num].b-tree[num].a+1)*c);                exit;        end;        mid:=(tree[num].a+tree[num].b)shr 1;        if l<=mid then add(tree[num].l,l,r,c);        if r>mid then add(tree[num].r,l,r,c);        tree[num].sum:=tree[tree[num].l].sum+tree[tree[num].r].sum;end;function find(num,l,r:longint):int64;var        mid,ans:int64;begin        if tree[num].lz<>0 then gx(num);        if (l<=tree[num].a)and(tree[num].b<=r) then exit(tree[num].sum);        ans:=0;        mid:=(tree[num].a+tree[num].b)shr 1;        if l<=mid then inc(ans,find(tree[num].l,l,r));        if r>mid then inc(ans,find(tree[num].r,l,r));        exit(ans);end;beginassign(input,'xds_sum.in'); reset(input);assign(output,'xds_sum.out'); rewrite(output);        readln(n);        for i:=1 to n do read(nn[i]);        tot:=0;        maketree(1,n);        readln(m);        for i:=1 to m do        begin                read(order);                if order=1 then                begin                        readln(a,b,c);                        add(1,a,b,c);                end                else                begin                        readln(a,b);                        writeln(find(1,a,b));                end;        end;close(input);close(output);end.


0 0
原创粉丝点击