poj3468 A Simple Problem with Integers(zkw区间修改模板)

此题是一道线段树的裸题,这里只是为了保存我的zkw线段树模板

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

typedef long long LL;

inline int geti() {
    static int Ina; static char Inc; static bool InSign;
    InSign = false;
    while ((Inc = getchar()) < '0' || Inc >'9') InSign |= Inc == '-';
    Ina = Inc - '0';
    while ((Inc = getchar()) >= '0' && Inc <= '9') Ina = (Ina << 3) + (Ina << 1) + Inc - '0';
    return InSign ? -Ina : Ina;
}

inline void Outi(LL x) {
    if (x < 0) putchar('-'), x = -x;
    static char buf[20]; static int Len;
    Len = 0; while (x) buf[++Len] = x % 10 + '0', x /= 10; 
    while (Len) putchar(buf[Len--]);
}

const int N = 200005;
int pre, dl[N << 1], dr[N << 1];
LL C[N << 1], ly[N << 1];
#define ls u<<1
#define rs u<<1|1
void Down(const int &u) {
    if (ly[u] && u < pre) {
        C[ls] += (dr[ls] - dl[ls] + 1) * ly[u];
        C[rs] += (dr[rs] - dl[rs] + 1) * ly[u];
        ly[ls] += ly[u]; ly[rs] += ly[u];
        ly[u] = 0;
    }
}

int Stack[30], top;
void Up(int u) {
    for (top = 0; u; u >>= 1) Stack[++top] = u;
    while (top) Down(Stack[top--]);
}

LL Query(int s, int t) {
    LL ret = 0; int lef(0), rig(0);
    for (s += pre - 1, t += pre + 1; s ^ t ^ 1; s >>= 1, t >>= 1) {
        if (~s & 1) (lef ? 1 : (Up(lef = s ^ 1),1)), ret += C[s ^ 1];
        if ( t & 1) (rig ? 1 : (Up(rig = t ^ 1),1)), ret += C[t ^ 1];
    }
    return ret;
}

void Update(int s, int t, const int &val) {
    int lef(0), rig(0);
    for (s += pre - 1, t += pre + 1; s ^ t ^ 1; s >>= 1, t >>= 1) {
        if (~s & 1) (lef ? 1 : (Up(lef = s ^ 1),1)), ly[s ^ 1] += val, C[s ^ 1] += (dr[s ^ 1] - dl[s ^ 1] + 1) * (LL)val;
        if ( t & 1) (rig ? 1 : (Up(rig = t ^ 1),1)), ly[t ^ 1] += val, C[t ^ 1] += (dr[t ^ 1] - dl[t ^ 1] + 1) * (LL)val;
    }
    for (lef >>= 1; lef; lef >>= 1) C[lef] = C[lef << 1 | 1] + C[lef << 1];
    for (rig >>= 1; rig; rig >>= 1) C[rig] = C[rig << 1 | 1] + C[rig << 1];
}

int main() {
    int n = geti(), m = geti();
    for (pre = 1; pre <= n + 1; pre <<= 1);
    for (int i = 1; i <= n; ++i) C[i + pre] = geti(), dl[i + pre] = dr[i + pre] = i;
    for (int i = pre; i; --i) C[i] = C[i << 1] + C[i << 1 | 1], dl[i] = dl[i << 1], dr[i] = dr[i << 1 | 1];
    char op; int x, y, z;
    while (m--) {
        while ((op = getchar()) < 'C' && op > 'Q');
        if (op ^ 'C') {
            x = geti(), y = geti();
            if (x > y) x ^= y ^= x ^= y;
            cout << Query(x, y) << endl;
        } else {
            x = geti(), y = geti(), z = geti();
            if (x > y) x ^= y ^= x ^= y;
            Update(x, y, z);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的纺织品企业财务管理系统,源码+数据库+毕业论文+视频演示 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升,也为了对纺织品企业财务信息进行更好的维护,纺织品企业财务管理系统的出现就变得水到渠成不可缺少。通过对纺织品企业财务管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。 纺织品企业财务管理系统通过MySQL数据库与Spring Boot框架进行开发,纺织品企业财务管理系统能够实现对财务人员,员工,收费信息,支出信息,薪资信息,留言信息,报销信息等信息的管理。 通过纺织品企业财务管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。 关键字:纺织品企业财务管理系统,薪资信息,报销信息;SpringBoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值