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;
    }
  • 相关阅读:
    高级(线性)素数筛
    Dijkstra(迪杰斯特拉)算法
    简单素数筛
    【解题报告】 POJ1958 奇怪的汉诺塔(Strange Tower of Hanoi)
    4 jQuery Chatting Plugins | jQuery UI Chatbox Plugin Examples Like Facebook, Gmail
    Web User Control Collection data is not storing
    How to turn on IE9 Compatibility View programmatically in Javascript
    从Javascrip 脚本中执行.exe 文件
    HtmlEditorExtender Ajax
    GRIDVIEW模板中查找控件的方式JAVASCRIPT
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9672858.html
Copyright © 2011-2022 走看看