1 条题解
-
2Root (sky1231) LV 8 MOD @ 2017-11-04 17:52:21
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #include <vector> #include <deque> #include <set> #include <limits> #include <string> #include <sstream> using namespace std; const int oo_min=0xcfcfcfcf,oo_max=0x3f3f3f3f; int n,m,st_size,st_cnt; int a[10000+1]; int st_t[1000000+1]; int st_l[1000000+1]; int st_r[1000000+1]; int st_mid[1000000+1]; int st_lc[1000000+1]; int st_rc[1000000+1]; int st_max[1000000+1]; void push_up_1(int now) { st_max[now]=max(st_max[st_lc[now]],st_max[st_rc[now]]); } void build_st_1(int &now,int l,int r) { if (now==0) now=++st_size; st_l[now]=l; st_r[now]=r; st_mid[now]=(l+r)/2; if (l==r) st_max[now]=a[l]; else if (l<r) { if (l<=st_mid[now]) build_st_1(st_lc[now],l,st_mid[now]); if (st_mid[now]+1<=r) build_st_1(st_rc[now],st_mid[now]+1,r); push_up_1(now); } } void copy_1(int now,int last) { st_l[now]=st_l[last]; st_r[now]=st_r[last]; st_mid[now]=st_mid[last]; st_lc[now]=st_lc[last]; st_rc[now]=st_rc[last]; st_max[now]=st_max[last]; } void update_st_1(int &now,int last,int p,int d) { now=++st_size; copy_1(now,last); if (st_l[now]==p&&p==st_r[now]) st_max[now]=d; else { if (p<=st_mid[now]) update_st_1(st_lc[now],st_lc[last],p,d); else if (st_mid[now]+1<=p) update_st_1(st_rc[now],st_rc[last],p,d); push_up_1(now); } } int sum_st_max_1(int now,int l,int r) { if (now==0) return oo_min; else if (st_l[now]==l&&r==st_r[now]) return st_max[now]; else if (r<=st_mid[now]) return sum_st_max_1(st_lc[now],l,r); else if (st_mid[now]+1<=l) return sum_st_max_1(st_rc[now],l,r); else return max(sum_st_max_1(st_lc[now],l,st_mid[now]),sum_st_max_1(st_rc[now],st_mid[now]+1,r)); } int main() { while (~scanf("%d%d",&n,&m)) { for (int i=1;i<=n;i++) scanf("%d",&a[i]); st_size=st_cnt=0; memset(st_t,0,sizeof(st_t)); memset(st_l,0,sizeof(st_l)); memset(st_r,0,sizeof(st_r)); memset(st_mid,0,sizeof(st_mid)); memset(st_lc,0,sizeof(st_lc)); memset(st_rc,0,sizeof(st_rc)); memset(st_max,0,sizeof(st_max)); build_st_1(st_t[++st_cnt],1,n); for (int i=1;i<=m;i++) { int o,v,l,r,d; scanf("%d%d",&o,&v); if (o==0) { scanf("%d%d",&l,&r); printf("%d\n",sum_st_max_1(st_t[v],l,r)); } else if (o==1) { scanf("%d%d",&l,&d); update_st_1(st_t[++st_cnt],st_t[v],l,d); } } } }
- 1