1.洛谷1531
点修改,查询区间最大值
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #define ls (cur<<1) 5 #define rs (cur<<1|1) 6 #define mid ((a[cur].l+a[cur].r)>>1) 7 #define len(x) (a[x].r-a[x].l+1) 8 using namespace std; 9 int n,m,k,x,y; 10 struct tree{int l,r,max;}a[800010]; 11 void read(int &k){ 12 k=0; int f=1; char c=getchar(); 13 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 14 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 15 k*=f; 16 } 17 void pushup(int cur){a[cur].max=max(a[ls].max,a[rs].max);} 18 void build(int cur,int l,int r){ 19 a[cur].l=l; a[cur].r=r; 20 if(l<r) build(ls,l,mid),build(rs,mid+1,r),pushup(cur); 21 else read(a[cur].max); 22 } 23 void update(int cur,int pos,int x){ 24 if(len(cur)==1&&a[cur].l==pos) a[cur].max=max(a[cur].max,x); 25 else update(pos<=mid?ls:rs,pos,x),pushup(cur); 26 } 27 int query(int cur,int l,int r){ 28 if(l<=a[cur].l&&a[cur].r<=r) return a[cur].max; 29 int ret=-0X7f7f7f; 30 if(l<=mid) ret=query(ls,l,r); 31 if(r>mid) ret=max(ret,query(rs,l,r)); 32 return ret; 33 } 34 int main(){ 35 read(n); read(m); build(1,1,n); 36 for (int i=1;i<=m;i++){ 37 char c=getchar(); 38 while (c!='Q'&&c!='U') c=getchar(); 39 read(x); read(y); 40 if(c=='Q') printf("%d ",query(1,x,y)); 41 else update(1,x,y); 42 } 43 return 0; 44 }
2.BZOJ 1012最大数Maxnumber
1 #include<cstdio> 2 #include<algorithm> 3 #define ls (cur<<1) 4 #define rs (cur<<1|1) 5 #define mid ((a[cur].l+a[cur].r)>>1) 6 using namespace std; 7 const int maxn=800010; 8 long long n,m,x,y,z,k,d; 9 struct tree{ 10 int l,r; 11 long long max; 12 }a[maxn]; 13 void read(long long &k){ 14 k=0; int f=1; char c=getchar(); 15 while (c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 16 while ('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 17 k*=f; 18 } 19 void build(int cur,int l,int r){ 20 a[cur].l=l; a[cur].r=r; 21 if (l<r){ 22 build(ls,l,mid); 23 build(rs,mid+1,r); 24 } 25 } 26 void add(int cur,long long pos,long long del){ 27 if (a[cur].l==pos&&a[cur].r==pos) a[cur].max=(a[cur].max+del)%d; 28 else{ 29 if (pos<=mid) add(ls,pos,del); 30 else add(rs,pos,del); 31 a[cur].max=max(a[ls].max,a[rs].max); 32 } 33 } 34 long long query(int cur,int l,int r){ 35 if (l<=a[cur].l&&a[cur].r<=r) return a[cur].max; 36 else{ 37 long long ret=-0X7f7f7f7f; 38 if (l<=mid) ret=max(ret,query(ls,l,r)); 39 if (r>mid) ret=max(ret,query(rs,l,r)); 40 return ret; 41 } 42 } 43 int main(){ 44 read(m); 45 build(1,1,m); 46 read(d); 47 long long t=0; 48 for (int i=1;i<=m;i++){ 49 char c=getchar(); 50 if (c=='A'){ 51 n++; 52 read(x); 53 add(1,n,x+t); 54 } 55 else{ 56 read(x); 57 t=query(1,n-x+1,n); 58 printf("%lld ",t); 59 } 60 } 61 return 0; 62 }