3211: 花神游历各国

来源:互联网 发布:淘宝买游戏装备流程 编辑:程序博客网 时间:2024/06/10 05:29
Description






Input






Output


每次x=1时,每行一个整数,表示这次旅行的开心度
Sample Input


4






1 100 5 5






5






1 1 2






2 1 2






1 1 2






2 2 3






1 1 4






Sample Output


101






11






11

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>using namespace std;const int maxm = 100005;#define ll long longtypedef struct{int l, r, flag;ll sum;}H;H tree[maxm*7];ll f[maxm], SUM = 0;void make(int num, int a, int b);void change(int num, int a, int b);void query(int num, int a, int b);int main(){int n, i, j, k, sum, q, d, x, y;scanf("%d", &n);for (i = 1;i <= n;i++)scanf("%d", &f[i]);make(1, 1, n);scanf("%d", &q);while (q--){scanf("%d%d%d", &d, &x, &y);if (d == 1){SUM = 0;query(1, x, y);printf("%lld\n", SUM);}elsechange(1, x, y);}return 0;}void make(int num, int a, int b){tree[num].l = a;tree[num].r = b;tree[num].flag = 0;if (a == b){tree[num].sum = f[a];if (tree[num].sum <= 1)tree[num].flag = 1;return;}int mid = (a + b) / 2;make(num << 1, a, mid);make(num << 1 | 1, mid + 1, b);tree[num].sum = tree[num << 1].sum + tree[num << 1 | 1].sum;}void change(int num, int a, int b){if (tree[num].flag)return;if (tree[num].l == tree[num].r){tree[num].sum = sqrt((double)tree[num].sum);if (tree[num].sum <= 1)tree[num].flag = 1;return;}int mid = (tree[num].l + tree[num].r) / 2;if (a>mid)change(num << 1 | 1, a, b);else if (b <= mid)change(num << 1, a, b);else{change(num << 1, a, mid);change(num << 1 | 1, mid + 1, b);}tree[num].sum = tree[num << 1].sum + tree[num << 1 | 1].sum;tree[num].flag = tree[num << 1].flag && tree[num << 1 | 1].flag;}void query(int num, int a, int b){if (tree[num].l >= a && tree[num].r <= b){SUM += tree[num].sum;return;}int mid = (tree[num].l + tree[num].r) / 2;if (a>mid)query(num << 1 | 1, a, b);else if (b <= mid)query(num << 1, a, b);else{query(num << 1, a, mid);query(num << 1 | 1, mid + 1, b);}}