比赛 4043级2023省选练习赛5 评测结果 AAAAAAAAAA
题目名称 市场 最终得分 100
用户昵称 yrtiop 运行时间 4.315 s
代码语言 C++ 内存使用 20.24 MiB
提交时间 2023-03-13 18:38:12
显示代码纯文本
#include <bits/stdc++.h>
typedef long long ll;
const ll INF = 1e18;

int read() {
    int s = 0,f = 1;
    char c = getchar();
    for(;c < '0'||c > '9';c = getchar())
        if(c == '-')f = -1;
    for(;c >= '0'&&c <= '9';c = getchar())
        s = (s << 1) + (s << 3) + (c ^ '0');
    return s * f;
}

const int maxn = 1e5 + 5;
int n,m;

int ls[maxn << 2],rs[maxn << 2];
ll sum[maxn << 2],lz[maxn << 2],maxv[maxn << 2],minv[maxn << 2];

void pushup(int i) {
    sum[i] = sum[i << 1] + sum[i << 1 | 1];
    maxv[i] = std::max(maxv[i << 1] , maxv[i << 1 | 1]);
    minv[i] = std::min(minv[i << 1] , minv[i << 1 | 1]);
    return ;
}

void pushdown(int i) {
    if(!lz[i])return ;
    lz[i << 1] += lz[i];
    lz[i << 1 | 1] += lz[i];
    minv[i << 1] += lz[i];
    minv[i << 1 | 1] += lz[i];
    maxv[i << 1] += lz[i];
    maxv[i << 1 | 1] += lz[i];
    sum[i << 1] += 1ll * (rs[i << 1] - ls[i << 1] + 1) * lz[i];
    sum[i << 1 | 1] += 1ll * (rs[i << 1 | 1] - ls[i << 1 | 1] + 1) * lz[i];
    lz[i] = 0;
    return ;
}

void build(int i,int l,int r) {
    ls[i] = l;
    rs[i] = r;
    if(l == r) {
        sum[i] = maxv[i] = minv[i] = read();
        return ;
    }
    int mid = l + r >> 1;
    build(i << 1 , l , mid);
    build(i << 1 | 1 , mid + 1 , r);
    pushup(i);
    return ;
}

void modify(int i,int l,int r,int k) {
    if(ls[i] >= l&&rs[i] <= r) {
        sum[i] += 1ll * k * (rs[i] - ls[i] + 1);
        lz[i] += k;
        maxv[i] += k;
        minv[i] += k;
        return ;
    }
    if(ls[i] > r||rs[i] < l)return ;
    pushdown(i);
    int mid = ls[i] + rs[i] >> 1;
    if(l <= mid)modify(i << 1 , l , r , k);
    if(r > mid)modify(i << 1 | 1 , l , r , k);
    pushup(i);
    return ;
}

void Maintain(int i,int l,int r,int k) {
    if(ls[i] >= l&&rs[i] <= r) {
        int x = maxv[i] - (int)std::floor((double)(1.0 * (double)maxv[i] / (double)k));
        int y = minv[i] - (int)std::floor((double)(1.0 * (double)minv[i] / (double)k));
        if(x == y) {
            sum[i] -= 1ll * (rs[i] - ls[i] + 1) * x;
            lz[i] -= x;
            maxv[i] -= x;
            minv[i] -= x;
            return ;
        }
    }
    if(ls[i] > r||rs[i] < l)return ;
    pushdown(i);
    int mid = ls[i] + rs[i] >> 1;
    if(l <= mid)Maintain(i << 1 , l , r , k);
    if(r > mid)Maintain(i << 1 | 1 , l , r , k);
    pushup(i);
    return ;
}

ll Querymin(int i,int l,int r) {
    if(ls[i] >= l&&rs[i] <= r)return minv[i];
    if(ls[i] > r||rs[i] < l)return INF;
    pushdown(i);
    int mid = ls[i] + rs[i] >> 1;
    ll s = INF;
    if(l <= mid)s = std::min(s , Querymin(i << 1 , l , r));
    if(r > mid)s = std::min(s , Querymin(i << 1 | 1 , l , r));
    return s;
}

ll Querysum(int i,int l,int r) {
    if(ls[i] >= l&&rs[i] <= r)return sum[i];
    if(ls[i] > r||rs[i] < l)return 0;
    pushdown(i);
    int mid = ls[i] + rs[i] >> 1;
    ll s = 0;
    if(l <= mid)s += Querysum(i << 1 , l , r);
    if(r > mid)s += Querysum(i << 1 | 1 , l , r);
    return s;
}

int main() {
	freopen("2017market.in","r",stdin);
	freopen("2017market.out","w",stdout);
    n = read();
    m = read();

    build(1 , 1 , n);

    while(m --) {
        int op = read(),l = read() + 1,r = read() + 1,k;
        switch(op) {
            case 1: {
                k = read();
                modify(1 , l , r , k);
                break ;
            }
            case 2: {
                k = read();
                Maintain(1 , l , r , k);
                break ;
            }
            case 3: {
                printf("%lld\n",Querymin(1 , l , r));
                break ;
            }
            case 4: {
                printf("%lld\n",Querysum(1 , l , r));
                break ;
            }
        }
    }
    return 0;
}