暑假前专题题解---数据结构---A

 

简单的线段树操作

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int maxn = 1e6 + 10;

LL sum[maxn<<2],maxx[maxn<<2],minn[maxn<<2];

LL sum1,max1 = -LLONG_MAX,min1 = LLONG_MAX;

void up(int id){

    sum[id] = sum[id<<1] + sum[id<<1|1];

    maxx[id] = max(maxx[id<<1] , maxx[id<<1|1]);

    minn[id] = min(minn[id<<1] , minn[id<<1|1]);

}

void rev(int l,int r,int id,int x,int c){

    if (l == r){

        sum[id] = minn[id] = maxx[id] = c;

        return;

    }

    int mid = (l + r) >> 1;

    if (x <= mid) rev(l, mid, id<<1, x, c);

    if (x > mid) rev(mid+1, r, id<<1|1,x ,c);

    up(id);

}

void query(int l,int r,int id,int L,int R){

    if (L <= l && r <= R){

        sum1 += sum[id];

        max1 = max(max1, maxx[id]);

        min1 = min(min1, minn[id]);

        return;

    }

    int mid = (l + r) >> 1;

    if (L <= mid) query(l, mid, id<<1, L, R);

    if (R > mid) query(mid+1, r, id<<1|1, L, R);

}

int main(){

    int o,x,y,n,m;

    scanf("%d%d",&n,&m);

    for (int i=0; i<m; i++) {

        scanf("%d%d%d",&o,&x,&y);

        if (o == 0){

            rev(1, n, 1, x, y);

        }else if (o == 1){

            query(1, n, 1, x, y);

            printf("%lld\n",sum1-max1-min1);

            sum1 = 0; max1 = -LLONG_MAX; min1 = LLONG_MAX;

        }

    }

    return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值