模拟+快排,T(40%)
#include<bits/stdc++.h>
using namespace std;
#define init ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,t;
const int N=1e5+5;
int w[N];
int tmp[N];
typedef pair<int,int> PII;
char c;
int a,b;
int q_sort(int a[],int l,int r,int k){
if(l>=r) return a[l];
int i=l-1,j=r+1,x=a[(l+r)>>1];
while(i<j){
do i++;while(a[i]>x);
do j--;while(a[j]<x);
if(i<j) swap(a[i],a[j]);
}
if(k<=j-l+1) return q_sort(a,l,j,k);
else return q_sort(a,j+1,r,k-(j-l+1));
}
int query(int a,int b){
if(b-a+1<8) return 0;
int cnt=0;
for(int i=a;i<=b;i++){
tmp[i]=w[i];
if(w[i]) cnt++;
}
if(cnt<8) return 0;
return q_sort(tmp,a,b,8);
}
int main(){
init
cin>>n>>t;
while(t--){
cin>>c>>a>>b;
if(c=='C') w[a]=b;
else cout<<query(a,b)<<endl;
}
}
线段树做法
维护[l,r]的前八大数
#include<bits/stdc++.h>
using namespace std;
#define init ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,t;
const int N=1e5+5;
struct node{
int l,r;
vector<int> vc;//维护[l,r]的前八大数
}tr[N<<2];
void pushup(int u){//用u左右结点的前八大数更新u节点的的
vector<int> &v=tr[u].vc;
vector<int> &l=tr[u<<1].vc;vector<int> &r=tr[u<<1|1].vc;
int i=0,j=0,k=0;
while(i<8&&j<8&&k<8){
if(l[i]>r[j]) v[k++]=l[i++];
else v[k++]=r[j++];
}
while(i<8&&k<8) v[k++]=l[i++];
while(j<8&&k<8) v[k++]=r[j++];
}
void build(int u,int l,int r){
tr[u].l=l;tr[u].r=r;
tr[u].vc.resize(8);
if(l==r) return;
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
}
void modify(int u,int x,int c){
if(tr[u].l==tr[u].r){
tr[u].vc[0]=c;
return;
}
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid) modify(u<<1,x,c);
else modify(u<<1|1,x,c);
pushup(u);
}
vector<int> v;
vector<int>& query(int u,int l,int r){
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].vc;
int mid=tr[u].l+tr[u].r>>1;
if(r<=mid) return query(u<<1,l,r);
if(l>mid) return query(u<<1|1,l,r);
v.resize(8);
vector<int> ll=query(u<<1,l,r);
vector<int> rr=query(u<<1|1,l,r);
int i=0,j=0,k=0;
while(i<8&&j<8&&k<8){
if(ll[i]>rr[j]) v[k++]=ll[i++];
else v[k++]=rr[j++];
}
while(i<8&&k<8) v[k++]=ll[i++];
while(j<8&&k<8) v[k++]=rr[j++];
return v;
}
int main(){
init
cin>>n>>t;
build(1,1,n);
while(t--){
char c;
int a,b;
cin>>c>>a>>b;
if(c=='C') modify(1,a,b);
else{
vector<int> res=query(1,a,b);
cout<<res[7]<<endl;
}
}
}