您的位置:首页 > 其它

hdu 1754 (线段树)

2013-05-24 11:59 141 查看
点击打开链接

模版。。。。

#include"stdio.h"
#include"string.h"
#define N 200005
struct tree
{
int x,y,mid;
int count;
}A[3*N];
int max(int x,int y)
{
return x>y?x:y;
}
void creat(int x,int y,int k)
{
A[k].x=x;
A[k].y=y;
A[k].mid=(x+y)/2;
A[k].count=1;
if(x==y)return ;
creat(x,A[k].mid,2*k);
creat(A[k].mid+1,y,2*k+1);
return ;
}
void insert(int x,int y,int k)
{
if(A[k].x==A[k].y&&A[k].x==x)
{
A[k].count=y;
return ;
}
if(A[k].mid<x)
insert(x,y,k*2+1);
else
insert(x,y,k*2);
A[k].count=max(A[2*k].count,A[2*k+1].count);
return ;
}
int search(int x,int y,int k)
{
if(A[k].x==x&&A[k].y==y)
{
return A[k].count;
}
int ans;
if(x>A[k].mid)
ans=search(x,y,2*k+1);
else if(y<=A[k].mid)
ans=search(x,y,2*k);
else
ans=max(search(x,A[k].mid,2*k),search(A[k].mid+1,y,2*k+1));
return ans;
}

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