您的位置:首页 > 产品设计 > UI/UE

HDU 4027 Can you answer these queries(线段树)

2015-03-25 23:27 429 查看
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
#include <stack>
using namespace std;
const int MAXN = 100000 + 10;
struct Tree
{
int l, r;
long long sum;
}tree[MAXN<<2];
void build(int l, int r, int rt)
{
tree[rt].l = l;
tree[rt].r = r;
if(l == r)
{
scanf("%I64d\n", &tree[rt].sum);
return ;
}
int m = (l + r) >> 1;
build(l, m, rt<<1);
build(m + 1, r, rt<<1|1);
tree[rt].sum = tree[rt<<1].sum + tree[rt<<1|1].sum;
}
void update(int l, int r, int rt)
{
if(tree[rt].l == l && tree[rt].r == r && tree[rt].sum == r - l + 1) return ;
if(tree[rt].l == tree[rt].r)
{
tree[rt].sum = sqrt(tree[rt].sum * 1.0);
return ;
}
int m = (tree[rt].l + tree[rt].r) >> 1;
if(r <= m) update(l, r, rt<<1);
else if(l > m) update(l, r, rt<<1|1);
else
{
update(l, m, rt<<1);
update(m + 1, r, rt<<1|1);
}
tree[rt].sum = tree[rt<<1].sum + tree[rt<<1|1].sum;
}
long long Query(int l, int r, int rt)
{
if(tree[rt].l == l && tree[rt].r == r) return tree[rt].sum;
int m = (tree[rt].l + tree[rt].r) >> 1;
long long ans = 0;
if(r <= m) ans = Query(l, r, rt<<1);
else if(l > m) ans = Query(l, r, rt<<1|1);
else
{
ans += Query(l, m, rt<<1);
ans += Query(m + 1, r, rt<<1|1);
}
return ans;
}
int main()
{
int kcase = 1;
int n, m;
while(scanf("%d", &n)!=EOF)
{
build(1, n, 1);
scanf("%d", &m);
int op, x, y;
printf("Case #%d:\n", kcase++);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d", &op, &x, &y);
if(x > y) swap(x, y);
if(op == 0) update(x, y, 1);
else printf("%I64d\n", Query(x, y, 1));
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: