题意:给出n个数,每次操作修改它的第s个数,询问给定区间的数的最大值
把前面两道题结合起来就可以了
自己还是敲不出来-------------
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 typedef long long LL; 14 const int INF = (1<<30)-1; 15 const int mod=1000000007; 16 const int maxn=200005; 17 18 int n,m; 19 int a[maxn]; 20 int nmax; 21 22 struct node{ 23 int l,r; 24 int nmax; 25 } tree[4*maxn]; 26 27 char s[105]; 28 29 30 void build_tree(int i,int l,int r){ 31 tree[i].l=l; 32 tree[i].r=r; 33 if(l==r){ 34 tree[i].nmax=a[l]; 35 return; 36 } 37 int mid=(l+r)/2; 38 build_tree(2*i,l,mid); 39 build_tree(2*i+1,mid+1,r); 40 tree[i].nmax=max(tree[2*i].nmax,tree[2*i+1].nmax); 41 } 42 43 void update(int i,int s,int w){ 44 if(tree[i].l==tree[i].r){ 45 tree[i].nmax=w; 46 return; 47 } 48 49 int mid=(tree[i].l + tree[i].r)/2; 50 if(s<=mid) update(2*i,s,w); 51 else update(2*i+1,s,w); 52 53 tree[i].nmax=max(tree[2*i].nmax,tree[2*i+1].nmax); 54 } 55 56 void query(int i,int l,int r){//查询 57 if(tree[i].nmax<=nmax) return; 58 if(tree[i].l==l&&tree[i].r==r){ 59 nmax = max(tree[i].nmax,nmax); 60 return; 61 } 62 int mid=(tree[i].l+tree[i].r)/2; 63 if(r<=mid) query(2*i,l,r); 64 else if(l>mid) query(2*i+1,l,r); 65 else{ 66 query(2*i,l,mid); 67 query(2*i+1,mid+1,r); 68 } 69 } 70 71 72 int main(){ 73 while(scanf("%d %d",&n,&m)!=EOF){ 74 memset(tree,0,sizeof(tree)); 75 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 76 77 build_tree(1,1,n); 78 79 while(m--){ 80 scanf("%s",s); 81 if(s[0]=='Q'){ 82 int l,r; 83 scanf("%d %d",&l,&r); 84 85 nmax=-INF; 86 query(1,l,r); 87 88 printf("%d ",nmax); 89 } 90 if(s[0]=='U'){ 91 int u,v; 92 scanf("%d %d",&u,&v); 93 update(1,u,v); 94 } 95 96 } 97 98 } 99 return 0; 100 }
加油啊---gooooooooooooooooooooooo