HDU4027 Can you answer these queries? (线段树)

来源:互联网 发布:sql语句添加字段例子 编辑:程序博客网 时间:2024/05/08 11:09



#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;typedef __int64 LL;const int maxn = 100010;LL sum[maxn<<2];void build(int l, int r, int rt){    if (l == r)    {        scanf("%I64d", &sum[rt]);        return ;    }    int m = (l + r) >> 1;    build(l, m, rt << 1);    build(m + 1, r, rt << 1 | 1);    sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void update(int L, int R, int l, int r, int rt){    if (sum[rt] <= r - l + 1)        return ;    if (l == r)    {        sum[rt] = (LL)sqrt((double)sum[rt]);        return ;    }    int m = (l + r) >> 1;    if (L <= m) update(L, R, l, m, rt << 1);    if (R > m) update(L, R, m + 1, r, rt << 1 | 1);    sum[rt] = sum[rt<<1] + sum[rt<<1|1];}LL query(int L, int R, int l, int r, int rt){    if (L <= l && R >= r)    {        if (sum[rt] <= r - l + 1 || l == r)            return sum[rt];    }    int m = (l + r) >> 1;    LL ans = 0;    if (L <= m) ans += query(L, R, l, m, rt << 1);    if (R > m) ans += query(L, R, m + 1, r, rt << 1 | 1);    return ans;}int main(){    int n, m, t, x, y;    int cas = 0;    while (scanf("%d", &n) != EOF)    {        cas++;        printf("Case #%d:\n", cas);        build(1, n, 1);        scanf("%d", &m);        while (m--)        {            scanf("%d %d %d", &t, &x, &y);            if (x > y) swap(x, y);            if (t == 0)                update(x, y, 1, n, 1);            else                printf("%I64d\n", query(x, y, 1, n, 1));        }        printf("\n");    }    return 0;}


原创粉丝点击