首页 > 代码库 > 树状数组
树状数组
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAXN 200020
#define MAX(a,b) (a>b?a:b)
#define Lowbit(x) (x & (-x))
int num[MAXN]={0,3,1,2,4,5,8,7,9,6};//注意从下标为1的位置开始保存数据
int C[MAXN];
int Query(int l,int r){
int ans=num[r];
while(true){
ans=MAX(ans,num[r]);
if(r==l) break;
for(r-=1;r-l>=Lowbit(r);r-=Lowbit(r)){
ans=MAX(ans,C[r]);
}
}
return ans;
}
void Modify(int p,int val,int end){
num[p]=val;
for(int i=p;i<=end;i+=Lowbit(i)){
C[i]=val;
for(int j=1;j<Lowbit(i);j<<=1){
C[i]=MAX(C[i],C[i-j]);
}
}
}
int main(int argc, char *argv[])
{
int n,m;
char op[3];
int s,e;
while(scanf("%d%d",&n,&m)!=EOF){
memset(C,0,sizeof(C));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
Modify(i,num[i],n);
}
while(m--){
scanf("%s%d%d",op,&s,&e);
if(op[0]==‘Q‘)
printf("%d\n",Query(s,e));
else
Modify(s,e,n);
}
}
}
来自为知笔记(Wiz)
附件列表
树状数组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。