一道比较简单的线段树,但是还是wa了两遍才ac,线段树写得还是不够熟练。
线段树的模板型挺强的,感觉不容易出现什么bug,就算出现了也都是笔误之类的。
#include<stdio.h> #include<string.h> #define N 200005 struct node { int x,y,max; }a[N*3]; int Max(int x,int y) { return x>y?x:y; } void CreatTree(int t,int x,int y) { a[t].x=x; a[t].y=y; a[t].max=0; if(x==y) return ; int temp=t*2; int mid=(x+y)/2; CreatTree(temp,x,mid); CreatTree(temp+1,mid+1,y); return ; } void InsertTree(int t,int x,int y) { if(a[t].x==a[t].y&&a[t].x==x) { a[t].max=y; return ; } int temp=t*2; int mid=(a[t].x+a[t].y)/2; if(x<=mid) { InsertTree(temp,x,y); } else { InsertTree(temp+1,x,y); } a[t].max=Max(a[temp].max,a[temp+1].max); return ; } int FindTree(int t,int x,int y) { int max; if(a[t].x==x&&a[t].y==y) { return a[t].max; } int temp=t*2; int mid=(a[t].x+a[t].y)/2; if(y<=mid) { max=FindTree(temp,x,y); } else if(x>mid) { max=FindTree(temp+1,x,y); } else { max=Max(FindTree(temp,x,mid),FindTree(temp+1,mid+1,y)); } return max; } int main() { int n,m; int i; char c; int temp; int x; while(scanf("%d%d",&n,&m)!=EOF) { CreatTree(1,1,n); for(i=0;i<n;i++) { scanf("%d",&temp); InsertTree(1,i+1,temp); } while(m--) { getchar(); scanf("%c %d %d",&c,&x,&temp); if(c=='U') { InsertTree(1,x,temp); } else if(c=='Q') { printf("%d\n",FindTree(1,x,temp)); } } } return 0; }