您的位置:首页 > 其它

HDU 1754 I Hate It

2012-08-09 21:15 232 查看
线段树。

代码如下:

#include<iostream>
#include<cstdio>
#define max 2000002

using namespace std;

typedef struct
{
int l, r;
int val;
}node;

node t[4*max];

void build(int l, int r, int rt)
{
t[rt].l=l;
t[rt].r=r;
if (l == r)
{
scanf("%d", &t[rt].val);
return ;
}
int m=(l+r)>>1;
build(l, m, rt<<1);
build(m+1, r, rt<<1|1);
t[rt].val= t[rt<<1].val > t[rt<<1|1].val ? t[rt<<1].val : t[rt<<1|1].val;
}

void update(int p, int v, int rt)
{
if (t[rt].r == t[rt].l)
{
t[rt].val=v;
return ;
}
int m=(t[rt].r+t[rt].l)>>1;
if (p <= m) update(p, v, rt<<1);
else update(p, v, rt<<1|1);
t[rt].val= t[rt<<1].val > t[rt<<1|1].val ? t[rt<<1].val : t[rt<<1|1].val;
}

int maxv(int L, int R, int rt)
{
if (L == t[rt].l && R == t[rt].r)
return t[rt].val;
int m=(t[rt].r+t[rt].l)>>1;
if (L > m)
return maxv(L, R, rt<<1|1);
else if (R <= m)
return maxv(L, R, rt<<1);
else
{
int t1=maxv(L, m, rt<<1);
int t2=maxv(m+1, R, rt<<1|1);
if (t1 > t2) return t1;
else return t2;
}

}

int main()
{
int a, b;
int n, m;
char op[2];
while(scanf("%d%d%*c", &n, &m) != EOF)
{
build(1, n, 1);
while(m--)
{
scanf("%s%d%d%*c", op, &a, &b);
if (op[0] == 'U')
update(a, b, 1);
else if (op[0] == 'Q')
printf("%d\n", maxv(a, b, 1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: