zoukankan      html  css  js  c++  java
  • CodeForces

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at him. A lot of important things were lost, in particular the favorite sequence of Picks.

    Fortunately, Picks remembers how to repair the sequence. Initially he should create an integer array a[1], a[2], ..., a[n]. Then he should perform a sequence of m operations. An operation can be one of the following:

    1. Print operation l, r. Picks should write down the value of .
    2. Modulo operation l, r, x. Picks should perform assignment a[i] = a[imod x for each i (l ≤ i ≤ r).
    3. Set operation k, x. Picks should set the value of a[k] to x (in other words perform an assignment a[k] = x).

    Can you help Picks to perform the whole sequence of operations?

    Input

    The first line of input contains two integer: n, m (1 ≤ n, m ≤ 105). The second line contains n integers, separated by space: a[1], a[2], ..., a[n] (1 ≤ a[i] ≤ 109) — initial value of array elements.

    Each of the next m lines begins with a number type .

    • If type = 1, there will be two integers more in the line: l, r (1 ≤ l ≤ r ≤ n), which correspond the operation 1.
    • If type = 2, there will be three integers more in the line: l, r, x (1 ≤ l ≤ r ≤ n; 1 ≤ x ≤ 109), which correspond the operation 2.
    • If type = 3, there will be two integers more in the line: k, x (1 ≤ k ≤ n; 1 ≤ x ≤ 109), which correspond the operation 3.

    Output

    For each operation 1, please print a line containing the answer. Notice that the answer may exceed the 32-bit integer.

    Examples

    Input
    5 5
    1 2 3 4 5
    2 3 5 4
    3 3 5
    1 2 5
    2 1 3 3
    1 1 3
    Output
    8
    5
    Input
    10 10
    6 9 6 7 6 1 10 10 9 5
    1 3 9
    2 7 10 9
    2 5 10 8
    1 4 7
    3 3 7
    2 7 9 9
    1 2 4
    1 6 6
    1 5 9
    3 1 10
    Output
    49
    15
    23
    1
    9

    Note

    Consider the first testcase:

    • At first, a = {1, 2, 3, 4, 5}.
    • After operation 1, a = {1, 2, 3, 0, 1}.
    • After operation 2, a = {1, 2, 5, 0, 1}.
    • At operation 3, 2 + 5 + 0 + 1 = 8.
    • After operation 4, a = {1, 2, 2, 0, 1}.
    • At operation 5, 1 + 2 + 2 = 5.

    题意:给出数组,有三种操作,分别是区间求和,区间取模 ,单点修改。

    思路:一个点被取模,那么其大小减半,所以一个数最多被操作log次,这样的话就不难想到势能线段树。

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn=100010;
    int Mx[maxn<<2]; ll sum[maxn<<2];
    void build(int Now,int L,int R)
    {
        if(L==R){
            scanf("%d",&Mx[Now]);
            sum[Now]=Mx[Now]; return ;
        }
        int Mid=(L+R)>>1;
        build(Now<<1,L,Mid); build(Now<<1|1,Mid+1,R);
        Mx[Now]=max(Mx[Now<<1],Mx[Now<<1|1]);
        sum[Now]=sum[Now<<1]+sum[Now<<1|1];
    }
    ll query(int Now,int L,int R,int l,int r){
        if(l<=L&&r>=R) return sum[Now];
        int Mid=(L+R)>>1; ll res=0;
        if(l<=Mid) res+=query(Now<<1,L,Mid,l,r);
        if(r>Mid) res+=query(Now<<1|1,Mid+1,R,l,r);
        return res;
    }
    void change(int Now,int L,int R,int pos,int val)
    {
        if(L==R){
            Mx[Now]=val; sum[Now]=val; return ;
        }
        int Mid=(L+R)>>1;
        if(pos<=Mid) change(Now<<1,L,Mid,pos,val);
        else change(Now<<1|1,Mid+1,R,pos,val);
        Mx[Now]=max(Mx[Now<<1],Mx[Now<<1|1]);
        sum[Now]=sum[Now<<1]+sum[Now<<1|1];
    }
    void modp(int Now,int L,int R,int l,int r,int P)
    {
        if(Mx[Now]<P) return ;
        if(L==R) {
            Mx[Now]%=P; sum[Now]=Mx[Now]; return ;
        }
        int Mid=(L+R)>>1;
        if(l<=Mid) modp(Now<<1,L,Mid,l,r,P);
        if(r>Mid) modp(Now<<1|1,Mid+1,R,l,r,P);
        Mx[Now]=max(Mx[Now<<1],Mx[Now<<1|1]);
        sum[Now]=sum[Now<<1]+sum[Now<<1|1];
    }
    int main()
    {
        int N,M,opt,L,R,P;
        scanf("%d%d",&N,&M);
        build(1,1,N);
        while(M--){
            scanf("%d",&opt);
            if(opt==1) {
                scanf("%d%d",&L,&R);
                printf("%I64d
    ",query(1,1,N,L,R));
            }
            else if(opt==2){
                scanf("%d%d%d",&L,&R,&P);
                modp(1,1,N,L,R,P);
            }
            else {
                scanf("%d%d",&L,&R);
                change(1,1,N,L,R);
            }
        }
        return 0;
    }
  • 相关阅读:
    python GUI
    Python 博客网站资源
    Python 100 天学习计划
    pycharm基本设置
    MySQL 57安装部署(Zip版)(Windows版)
    nginx在centos下的安装
    仓位计算
    python笔记
    vue(一)--监听事件
    Hibernate(五)--级联
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9672858.html
Copyright © 2011-2022 走看看