这是道裸的线段树题,而且不需要区间修改。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int n,m,a[200001],ans[5001],f1,f2; 6 char s; 7 struct k1{ 8 int l; 9 int r; 10 int mid; 11 int date; 12 }tree[1000000]; 13 void build(int l,int r,int pos) 14 { 15 tree[pos].l=l; 16 tree[pos].r=r; 17 tree[pos].mid=(l+r)/2; 18 if(l==r) 19 tree[pos].date=a[l]; 20 else 21 { 22 build(l,tree[pos].mid,pos<<1); 23 build(tree[pos].mid+1,r,(pos<<1)+1); 24 tree[pos].date=max(tree[pos<<1].date,tree[(pos<<1)+1].date); 25 } 26 } 27 int query(int l,int r,int pos) 28 { 29 if((tree[pos].l==l)&&(tree[pos].r==r)) 30 return tree[pos].date; 31 if(r<=tree[pos].mid) 32 return query(l,r,pos<<1); 33 if(l>tree[pos].mid) 34 return query(l,r,(pos<<1)+1); 35 return max(query(l,tree[pos].mid,pos<<1),query(tree[pos].mid+1,r,(pos<<1)+1)); 36 } 37 void update(int num,int pos) 38 { 39 if(tree[pos].l==tree[pos].r) 40 tree[pos].date=a[num]; 41 else 42 { 43 if(num<=tree[pos].mid) 44 { 45 update(num,pos<<1); 46 if(tree[pos<<1].date>tree[pos].date) 47 tree[pos].date=tree[pos<<1].date; 48 } 49 else 50 { 51 update(num,(pos<<1)+1); 52 if(tree[(pos<<1)+1].date>tree[pos].date) 53 tree[pos].date=tree[(pos<<1)+1].date; 54 } 55 } 56 } 57 int main() 58 { 59 scanf("%d%d",&n,&m); 60 for(int i=1;i<=n;i++) 61 scanf("%d",&a[i]); 62 build(1,n,1); 63 for(int i=1;i<=m;i++) 64 { 65 scanf("%s",&s); 66 if(s=='Q') 67 { 68 scanf("%d%d",&f1,&f2); 69 ans[i]=query(f1,f2,1); 70 } 71 if(s=='U') 72 { 73 scanf("%d%d",&f1,&f2); 74 if(a[f1]<f2) 75 { 76 a[f1]=f2; 77 update(f1,1); 78 } 79 } 80 } 81 for(int i=1;i<=m;i++) 82 { 83 if(ans[i]!=0) 84 printf("%d ",ans[i]); 85 } 86 return 0; 87 }