2556. 第八大奇迹
有人困难题 一次提交ac 谁呀?
我呀 hhhh
但是代码有点不简洁...
2556. 第八大奇迹 - AcWing题库
ac代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N=400010;
struct node{int a[8],b[8];int l,r;
}h[N];
void pushup(int idx){if(idx==0) return ;int i0=0,i1=0,i2=0;while(i0<8){if(h[idx<<1].a[i1]<h[idx<<1|1].a[i2]) h[idx].a[i0]=h[idx<<1|1].a[i2], i2++;else h[idx].a[i0]=h[idx<<1].a[i1], i1++;i0++;}pushup(idx>>1);
}
void build(int idx,int l,int r){h[idx].l=l,h[idx].r=r;if(l==r) return ;int mid=l+r>>1;build(idx<<1,l,mid);build(idx<<1|1,mid+1,r);
}
int find(int idx,int p){if(h[idx].l==h[idx].r) return idx;int mid=h[idx].l+h[idx].r>>1;if(p<=mid) return find(idx<<1,p);else return find(idx<<1|1,p);
}
void add(int p,int x){int idx=find(1,p);h[idx].a[0]=x;pushup(idx>>1);
}
void up(int idx,int idx1,int idx2){int i0=0,i1=0,i2=0;while(i0<8){if(h[idx1].b[i1]<h[idx2].b[i2]) h[idx].b[i0]=h[idx2].b[i2], i2++;else h[idx].b[i0]=h[idx1].b[i1], i1++;i0++;}
}
void f(int x,int y,int idx){if(x<=h[idx].l&&y>=h[idx].r){memcpy(h[idx].b,h[idx].a,sizeof(h[idx].a));return ;}int mid=h[idx].l+h[idx].r>>1;int flag1=0,flag2=0;memset(h[idx].b,0,sizeof(h[idx].b));if(x<=mid){f(x,y,idx<<1); flag1++;}if(y>mid){f(x,y,idx<<1|1); flag2++;}if(flag1&&flag2){up(idx,idx<<1,idx<<1|1);}else if(flag1){up(idx,idx<<1,0);}else{up(idx,0,idx<<1|1);}
}
int main(){int l,n; scanf("%d%d",&l,&n);build(1,1,l);while(n--){char c; int p,x;getchar(); scanf("%c",&c);scanf("%d%d",&p,&x);if(c=='C'){add(p,x);}else{f(p,x,1);printf("%d\n",h[1].b[7]);}// for(int i=0;i<=19;i++){// printf("#%d\n",i);// for(int j=0;j<8;j++){// printf("%d ",h[i].a[j]);// }// printf("\n");// for(int j=0;j<8;j++){// printf("%d ",h[i].b[j]);// }// printf("\n");// }}return 0;
}