树状数组求最值 hdu 1754
模板题,木有什么好说的。。。
直接上模板吧~
代码实现:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int num[200050]; int tree[200050]; int n; int bit(int x){ return x&(-x); } int insert(int p,int v){ num[p]=v; for(int k=p;k<=n;k+=bit(k)){ if(tree[k]<v){ tree[k]=v; } else break; } return 0; } int change(){ for(int k=1;k<=n;k++){ tree[k]=num[k]; for(int g=1;g<bit(k);g<<=1){ if(tree[k]<tree[k-g]){ tree[k]=tree[k-g]; } } } return 0; } int getmax(int a,int b){ int res=num[b]; while(1){ if(res<num[b]) res=num[b]; if(a==b) break; for(b=b-1;b-a>=bit(b);b-=bit(b)){ if(res<tree[b]) res=tree[b]; } } return res; } int main(){ int m; while(scanf("%d%d",&n,&m)!=EOF){ memset(tree,0,sizeof(tree)); for(int i=1;i<=n;i++){ int temp; scanf("%d%*c",&temp); num[i]=temp; } change(); // getchar(); for(int j=1;j<=m;j++){ char temp1; int temp2,temp3; char cha[10]; gets(cha); scanf("%c%d%d%*c",&temp1,&temp2,&temp3); // cout<<temp1<<" "<<temp2<<" "<<temp3<<endl; if(temp1=='Q') printf("%d\n",getmax(temp2,temp3)); else{ insert(temp2,temp3); } } } return 0; }