您的位置:首页 > 其它

【线段树】hdu 1754

2011-08-03 23:17 148 查看
树状数组不行呐,复杂度太高

#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>

using namespace std;

#define LL long long
#define pi acos(-1)
#define N  200010
#define INF INT_MAX
#define eps 1e-8
//******************
//B
//******************
struct node
{
int l,r;
int mx;
}tree[N*3];
int n,m;
int big;
void Build(int i,int s,int t)
{
tree[i].l=s;
tree[i].r=t;
tree[i].mx=0;
if(s==t)return ;
int mid=(s+t)>>1;
Build(2*i,s,mid);
Build(2*i+1,mid+1,t);
}

void update(int i,int pos,int y)
{
if(tree[i].l==pos &&tree[i].r==pos)
tree[i].mx=y;
else
{
int mid=(tree[i].l+tree[i].r)>>1;
if(pos<=mid)
update(2*i,pos,y);
else
update(2*i+1,pos,y);
if(y>tree[i].mx)
tree[i].mx=y;
}
}

void ask(int i,int a,int b)
{
if(tree[i].l==a && tree[i].r==b)
{
if(big<tree[i].mx)
big=tree[i].mx;
}
else
{
int mid=(tree[i].l+tree[i].r)>>1;
if(b<=mid)
ask(2*i,a,b);
else
if(a>mid)
ask(2*i+1,a,b);
else
{
ask(2*i,a,mid);
ask(2*i+1,mid+1,b);
}
}
}

int main()
{
// freopen("a.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j,k;
Build(1,1,n);
for(i=1;i<=n;++i)
{
int a;
scanf("%d",&a);
update(1,i,a);
}
char str[5];
while(m--)
{
scanf("%s",str);
int a,b;
scanf("%d%d",&a,&b);
if(str[0]=='Q')
{
big=0;
ask(1,a,b);
printf("%d\n",big);
}else
if(str[0]=='U')
update(1,a,b);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: