HDU 1754 I Hate It 线段树入门

来源:互联网 发布:js urlencode转码 编辑:程序博客网 时间:2024/05/02 04:58
//读取字符的时候要用字符数组 单个字符会WA#include<stdio.h>#include<string>#include<cstring>#include<queue>#include<algorithm>#include<functional>#include<vector>#include<iomanip>#include<math.h>#include<iostream>#include<sstream>#include<set>#include<climits>#include<map>#include<bitset>using namespace std;const int MAX=200005;int A[MAX],F[4*MAX];void build(int x,int left,int right){    if (left==right)    {        F[x]=A[left];        return;    }    int mid=(left+right)/2;    build(x*2,left,mid);    build(x*2+1,mid+1,right);    F[x]=max(F[x*2],F[x*2+1]);}void change(int x,int left,int right,int pos,int num){    if (left==right)    {        F[x]=num;        return;    }    int mid=(left+right)/2;    if (pos<=mid)        change(x*2,left,mid,pos,num);    else        change(x*2+1,mid+1,right,pos,num);    F[x]=max(F[x*2],F[x*2+1]);}int query(int x,int left,int right,int L,int R){    if (left>=L&&right<=R)        return F[x];    if (right<L||left>R)        return -99999999;    if (left==right)        return F[x];    int mid=(left+right)/2;    if (R<=mid)        return query(x*2,left,mid,L,R);    else if (L>mid)        return query(x*2+1,mid+1,right,L,R);    else        return max(query(x*2,left,mid,L,R),query(x*2+1,mid+1,right,L,R));}int main(){    int N,M,a,b;    char command[15]={0};    while (scanf("%d%d",&N,&M)!=EOF)    {        for (int i=1;i<=N;i++)            scanf("%d",&A[i]);        build(1,1,N);        for (int i=1;i<=M;i++)        {            scanf("%s %d%d",command,&a,&b);            if (command[0]=='Q')                printf("%d\n",query(1,1,N,a,b));            else if (command[0]=='U')                change(1,1,N,a,b);        }    }    return 0;}
0 0
原创粉丝点击