codeforces 438D(线段树)

来源:互联网 发布:四维单子数据看男女 编辑:程序博客网 时间:2024/06/02 02:24

传送门
几乎是线段树模板题,只需进行剪枝:对于区间最大值大于模数的区间才进行模运算。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cstdlib>#define root 1,1,n#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,rusing namespace std;typedef long long ll;const int maxn=1e5+2;int n,m;ll sum[maxn<<2],maxx[maxn<<2];inline int read() {    int x=0;char c=getchar();    while (c<'0'||c>'9') c=getchar();    while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();    return x;}inline void pushup(int rt) {    sum[rt]=sum[rt<<1]+sum[rt<<1|1];    maxx[rt]=max(maxx[rt<<1],maxx[rt<<1|1]);}void build(int rt,int l,int r) {    if (l==r) {        sum[rt]=maxx[rt]=(ll)read();        return ;    }    int mid=(l+r)>>1;    build(lson),    build(rson);    pushup(rt);}ll query(int rt,int l,int r,int L,int R) {    if (L<=l&&r<=R) return sum[rt];    int mid=(l+r)>>1;    ll ans=0;    if (L<=mid) ans+=query(lson,L,R);    if (mid<R) ans+=query(rson,L,R);    return ans;}void modify(int rt,int l,int r,int L,int R,ll val) {    if (maxx[rt]<val) return ;    if (l==r) {        maxx[rt]%=val,        sum[rt]%=val;        return ;    }    int mid=(l+r)>>1;    if (L<=mid) modify(lson,L,R,val);    if (mid<R) modify(rson,L,R,val);    pushup(rt);}void update(int rt,int l,int r,int pos,ll val) {    if (l==r) {        maxx[rt]=sum[rt]=val;        return ;    }    int mid=(l+r)>>1;    if (pos<=mid) update(lson,pos,val);    else update(rson,pos,val);    pushup(rt);}int main() {//  freopen("codeforces 438D.in","r",stdin);    while (~scanf("%d%d",&n,&m)) {        build(root);        while (m--) {            int which=read(),L,R,pos,val;            switch (which) {                case 1:L=read(),R=read(),printf("%lld\n",query(root,L,R));break;                case 2:L=read(),R=read(),val=read(),modify(root,L,R,(ll)val);break;                case 3:pos=read(),val=read(),update(root,pos,(ll)val);break;            }        }    }    return 0;}
原创粉丝点击