HDU 1754 I Hate It(线段树,单点更新,线段查询)

来源:互联网 发布:2017年9月宏观数据 编辑:程序博客网 时间:2024/06/05 21:21

这道题是线段树入门题,其问题是单点更新,线段查询。

这里本来还打算用lazy标记做一下,但是不行,必须更新到单点


#include <map>#include <set>#include <queue>#include <cmath>#include <cmath>#include <vector>#include <bitset>#include <vector>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define inf 0x3fffffff#define mid ((l+r)>>1)#define LSON(x) (x) << 1#define RSON(x) (x) << 1 | 1#define mem(x) memset(x,0,sizeof(x))#define max(a,b) ((a)>(b)?(a):(b))const int maxn=100+200000;const double eps=1e-6;typedef unsigned __int64 ull;vector< vector<int> > edge;/*struct P{int v,next;}p[maxn<<2];int head[maxn];//st from 1*/int N,M,T;typedef struct  {int l,r,mas;}P;P tt[maxn<<3];/*int push_up(int p,int l,int r){}int push_down(int p,int l,int r){}*/void build(int p,int l,int r){tt[p].l=l;tt[p].r=r;tt[p].mas=0;if(l==r)return;build(p<<1,l,mid);build(p<<1 |1,mid+1,r);}int update(int p,int l,int r,int d){if(tt[p].l==l && tt[p].r==r){tt[p].mas=d;return d;}int m=(tt[p].l+tt[p].r)>>1;int tmp,ans=tt[p].mas;if(r<=m) tmp=update(p<<1,l,r,d);else if(l>m) tmp=update(p<<1 |1,l,r,d);else{tmp=update(p<<1,l,m,d);ans=max(ans,tmp);tmp=update(p<<1 |1,m+1,r,d);}return tt[p].mas=max(ans,tmp);}int query(int p,int l,int r){if(tt[p].l==l && tt[p].r==r)return tt[p].mas;int m=(tt[p].l+tt[p].r)>>1;int tmp,ans=0;if(r<=m) tmp=query(p<<1,l,r);else if(l>m) tmp=query(p<<1 |1,l,r);else{tmp=query(p<<1,l,m);ans=max(ans,tmp);tmp=query(p<<1 |1,m+1,r);}return ans=max(ans,tmp);}int main(){    int cas=1;int i,j,k;int ans;    char str[30];while(~scanf("%d%d",&N,&M)){build(1,1,N);for(i=1;i<=N;i++){scanf("%d",&k);update(1,i,i,k);}for(i=0;i<M;i++){scanf("%s%d%d",str,&j,&k);if(str[0]=='U') update(1,j,j,k);else {ans=query(1,j,k);printf("%d\n",ans);}}}    return 0;}


0 0