HDU 1754 I Hate It 线段树入门

    xiaoxiao2026-01-12  1

    //读取字符的时候要用字符数组 单个字符会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; }
    转载请注明原文地址: https://ju.6miu.com/read-1305940.html
    最新回复(0)