[kuangbin带你飞]专题七 线段树 B

来源:互联网 发布:linux 存放.rpm的目录 编辑:程序博客网 时间:2024/05/20 23:56

https://vjudge.net/contest/66989#problem/B

线段树基础题 (单点修改,区间最大值)

#include<stdio.h>#include<algorithm>#include<string.h>#include<iostream>#define lid (id << 1)#define rid (id << 1 | 1)using namespace std;const int MAXN=200010;int a[MAXN];struct Node{    int l,r;    int sum,Max;    void updata(int x)    {      //  sum+=x; //增加        sum=x; //修改        Max=sum;    }}tr[MAXN*4];void push_up(int id){    tr[id].sum = tr[lid].sum + tr[rid].sum;    tr[id].Max = max(tr[lid].Max,tr[rid].Max);}void build(int id,int l,int r){    tr[id].l=l;tr[id].r=r;    if(l==r) tr[id].sum=tr[id].Max=a[l];    else    {         int mid=(l+r)>>1;         build(lid,l,mid);         build(rid|1,mid+1,r);         push_up(id);    }}void updata(int id,int x,int v){    if(tr[id].l==x&&tr[id].r==x)  tr[id].updata(v);    else{        int mid=(tr[id].l+tr[id].r)>>1;        if(x<=mid)  updata(lid,x,v);        else      updata(rid,x,v);        push_up(id);    }}/*int query_sum(int id,int l,int r){    if(l==tr[id].l&&r==tr[id].r) return tr[id].sum;    int mid=(tr[id].l+tr[id].r)>>1;    if(r<=mid)  return query_sum(lid,l,r);    else if(l>mid)   return query_sum(rid,l,r);    else  return query_sum(lid,l,mid)+query_sum(rid,mid+1,r);} */int query_max(int id,int l,int r){    if(l==tr[id].l&&r==tr[id].r) return tr[id].Max;    int mid=(tr[id].l+tr[id].r)>>1;    if(r<=mid)  return query_max(lid,l,r);    else if(l>mid)   return query_max(rid,l,r);    else  return max(query_max(lid,l,mid),query_max(rid,mid+1,r));}int main(){    int N,M;    char ch;    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(" %c",&ch);            if(ch=='Q')            {                int x,y;                scanf("%d%d",&x,&y);                printf("%d\n",query_max(1,x,y));            }            else if (ch=='U')            {                int id,data;                scanf("%d%d",&id,&data);                updata(1,id,data);            }        }    }}





阅读全文
0 0