线段树之HDU 1754 I hate it

来源:互联网 发布:windows键怎么关闭 编辑:程序博客网 时间:2024/05/21 18:39

题目:HDU 1754 I hate it!

//Must so#include<bits/stdc++.h>#define mem(a,x) memset(a,x,sizeof(a))#define sqrt(n) sqrt((double)n)#define pow(a,b) pow((double)a,(int)b)#define inf 1<<29#define NN 200006using namespace std;const double PI = acos(-1.0);typedef long long LL;struct Node{    int l,r,v;}q[NN*4];void buildtree(int i,int l,int r){    q[i].l = l,q[i].r = r;    if (l == r)    {        scanf("%d",&q[i].v);        return ;    }    int mid = (l+r)/2;    buildtree(i<<1,l,mid);    buildtree((i<<1)+1,mid+1,r);    q[i].v = max(q[i<<1].v,q[(i<<1)+1].v);}void update (int i ,int a,int b){    if (q[i].l == q[i].r&&q[i].l == a)    {        q[i].v = b;        return ;    }    if (a<=q[i<<1].r) update(i<<1,a,b);    else update((i<<1)+1,a,b);    q[i].v = max(q[i<<1].v,q[(i<<1)+1].v);}int query(int i,int l,int r){    if (l <= q[i].l&&q[i].r <= r)    {        return q[i].v;    }    int mid = (q[i].l+q[i].r)/2;    if (r <= mid) return query(i<<1,l,r);    else if (l > mid) return query((i<<1)+1,l,r);    else return max(query(i<<1,l,mid),query((i<<1)+1,mid+1,r));}int main(){    int n,m;    while (cin>>n>>m)    {        buildtree(1,1,n);        while (m--)        {            char tmp;            int a,b;            cin>>tmp>>a>>b;            if (tmp == 'Q') printf("%d\n",query(1,a,b));            else if (tmp == 'U') update(1,a,b);        }    }    return 0;}


0 0
原创粉丝点击