• codeforces --- Round #248 (Div. 2) B. Kuriyama Mirai's Stones


    B. Kuriyama Mirai's Stones

     

    Kuriyama Mirai has killed many monsters and got many (namely n) stones. She numbers the stones from 1 to n. The cost of the i-th stone is vi. Kuriyama Mirai wants to know something about these stones so she will ask you two kinds of questions:

    1. She will tell you two numbers, l and r (1 ≤ l ≤ r ≤ n), and you should tell her .
    2. Let ui be the cost of the i-th cheapest stone (the cost that will be on the i-th place if we arrange all the stone costs in non-decreasing order). This time she will tell you two numbers, l and r (1 ≤ l ≤ r ≤ n), and you should tell her .

    For every question you should give the correct answer, or Kuriyama Mirai will say "fuyukai desu" and then become unhappy.

    Input

    The first line contains an integer n (1 ≤ n ≤ 105). The second line contains n integers: v1, v2, ..., vn (1 ≤ vi ≤ 109) — costs of the stones.

    The third line contains an integer m (1 ≤ m ≤ 105) — the number of Kuriyama Mirai's questions. Then follow m lines, each line contains three integers type, l and r (1 ≤ l ≤ r ≤ n; 1 ≤ type ≤ 2), describing a question. If type equal to 1, then you should output the answer for the first question, else you should output the answer for the second one.

    Output

    Print m lines. Each line must contain an integer — the answer to Kuriyama Mirai's question. Print the answers to the questions in the order of input.

    Sample test(s)
    Input
    6
    6 4 2 7 2 7
    3
    2 3 6
    1 3 4
    1 1 6
    Output
    24
    9
    28
    Input
    4
    5 5 2 3
    10
    1 2 4
    2 1 4
    1 1 1
    2 1 4
    2 1 2
    1 1 1
    1 3 3
    1 1 3
    1 4 4
    1 2 2
    Output
    10
    15
    5
    15
    5
    5
    2
    12
    3
    5
    Note

    Please note that the answers to the questions may overflow 32-bit integer type.

    【题目大意】

    有一些石头排成一行,每个石头都有自己的权值,现在有两种询问:

    一种是1开头的:询问原来的石头顺序下,第i到第j颗石头的的权值只和;

    一种是2开头的,询问所有石头按照大小顺序排列以后,第i到第j颗石头的权值之和;

    这题乍看很像树状数组,但是并不是树状数组,直接模拟即可.

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define MAX 100100
    using namespace std;
    
    __int64 m,a,b,c;
    __int64 n,i,sum;
    __int64 num1[MAX];
    __int64 num2[MAX];
    __int64 sum1[MAX];
    __int64 sum2[MAX];
    
    int main()
    {
        sum=0;
        scanf("%I64d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%I64d",&num1[i]);
            sum+=num1[i];
            sum1[i]=sum;
        }
        memcpy(num2,num1,sizeof(num1));
        sort(num2,num2+n);
        sum=0;
        for(i=0;i<n;i++)
        {
            sum+=num2[i];
            sum2[i]=sum;
        }
        scanf("%I64d",&m);
        while(m--)
        {
            scanf("%I64d%I64d%I64d",&a,&b,&c);
            if(a==1)
                printf("%I64d
    ",sum1[c-1]-sum1[b-2]);
            else
                printf("%I64d
    ",sum2[c-1]-sum2[b-2]);
        }
        return 0;
    }
  • 相关阅读:
    Linux创建AppImage打包程序(以TrustedQSL为例)
    SDR++跨平台开源SDR应用程序
    golang 无限极树的结构化返回
    IDEA 使用Git图文详解(学好idea操作git大全)
    多网卡主机无法上网
    蓝湖如何修改标注线条颜色
    设计模式代理模式
    设计模式装饰器模式
    设计模式适配器模式
    设计模式责任链模式
  • 原文地址:https://www.cnblogs.com/crazyacking/p/3749778.html
Copyright © 2020-2023  润新知