• B


      第一次打 改了半天  各种小错误 难受

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int maxn=2000000+7;
     5 int a[maxn],n;
     6 struct Node{
     7     int l,r;
     8     long long Max,lazy;
     9     void update(long long  val){
    10         ;//本题没用
    11     }
    12 }tree[maxn*5];
    13 void push_up(int x){
    14     tree[x].Max=max(tree[x<<1].Max,tree[x<<1|1].Max);
    15 }
    16 
    17 void push_down(int x){//本题不用
    18     int lazyval=tree[x].lazy;
    19     if(lazyval){
    20         tree[x<<1].update(lazyval);
    21         tree[x<<1|1].update(lazyval);
    22         tree[x].lazy=0;
    23     }
    24 }
    25 void build(int x,int l,int r){
    26         tree[x].l=l,tree[x].r=r;
    27         tree[x].Max=tree[x].lazy=0;
    28         if(l==r){//建树 初始化叶子
    29             tree[x].Max=a[l];
    30         }
    31         else {//递归建树
    32             int mid=l+r>>1;
    33             build(x<<1,l,mid);
    34             build(x<<1|1,mid+1,r);
    35             push_up(x);
    36         }
    37 }
    38 void  update(int x,int l,int r,long long  val){
    39     int L=tree[x].l,R=tree[x].r;
    40     if(l==L&&R==r&&L==R){tree[x].Max=val;return ;}//单点修改值
    41      if(r<L||l>R)return ;//如果这两个区间没有交集 x的区间就不用修改了
    42          //int mid=L+R>>1;
    43         update(x<<1,l,r,val);//分别修改左右区间
    44         update(x<<1|1,l,r,val);
    45         push_up(x);//更新左右区间
    46 }
    47 
    48 long long query(int x,int l,int r){
    49     int L=tree[x].l,R=tree[x].r;
    50     if(l<=L&&R<=r){return tree[x].Max;}//如果当前节点区间完全被要查询区间包含 直接返回该节点的最大值即可
    51      if(r<L||l>R)return 0;//如果当前区间不在要查询区间里面,返回一个不影响其他查找的最小值 0 (学生分数都是正数)
    52     //     int mid=L+R>>1;
    53          long long ans=0;
    54         ans=max(query(x<<1,l,r),query(x<<1|1,l,r));
    55     return ans;
    56 }
    57 
    58 int main(){
    59 int n,q;
    60 while(scanf("%d%d",&n,&q)==2){
    61     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    62     build(1,1,n);
    63     char op[10];
    64         int l,r;
    65     for(int i=1;i<=q;i++)
    66     {
    67         scanf("%s%d%d",op,&l,&r);
    68         if(op[0]=='Q'){
    69             //int l,r;
    70             //scanf("%d%d",&l,&r);
    71             printf("%lld
    ",query(1,l,r));
    72         }
    73         else if(op[0]=='U'){
    74             //int l,r;
    75             //scanf("%d%d",&l,&r);
    76             update(1,l,l,r);
    77         }
    78     }
    79 
    80 }
    81     return 0;
    82 }
  • 相关阅读:
    Java StringTokenizer Example
    java 删除字符串中的特定字符
    [Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
    Uniform resource name
    [Python]网络爬虫(一):抓取网页的含义和URL基本构成
    coco2dx 精灵类
    window和nodejs作用域区别(待续)
    ubuntu开机遇到-您的当前网络有.local域,我们不建议这样做而且这与AVAHI网络服务探测不兼容。该服务已被禁用
    ruby中的reject和reject!
    ruby中将数组转换成hash
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10292995.html
Copyright © 2020-2023  润新知