简单单调队列。
code:
#include<cstdio>
int data[1000001] ;
int queue[1000001] ;
int num[1000001] ;
int h, r, n ;
void insert(){
if(r==h-1||data[n]<queue[r]){
r ++ ;
queue[r] = data[n] ;
num[r] = n ;
}
else{
while(r>=h&&data[n]>=queue[r])
r -- ;
queue[++r] = data[n] ;
num[r] = n ;
}
}
void getMax(){
if(h>r) printf("-1\n") ;
else printf("%d\n", queue[h]) ;
}
int main(){
char temp[6] ;
int t, l ;
scanf("%d", &t) ;
while(t--){
h = n = l = 0 ;
r = -1 ;
queue[0] = 0 ;
scanf("%s", temp) ;
while(true){
scanf("%s", temp) ;
if(temp[0]=='C'){
scanf("%s", temp) ;
scanf("%d", &data[n]) ;
insert() ;
n ++ ;
}
else if(temp[0]=='Q'){
while(r>=h&&num[h]<l)
h ++ ;
getMax() ;
}
else if(temp[0]=='G')
l ++ ;
else break ;
}
}
return 0 ;
int data[1000001] ;
int queue[1000001] ;
int num[1000001] ;
int h, r, n ;
void insert(){
if(r==h-1||data[n]<queue[r]){
r ++ ;
queue[r] = data[n] ;
num[r] = n ;
}
else{
while(r>=h&&data[n]>=queue[r])
r -- ;
queue[++r] = data[n] ;
num[r] = n ;
}
}
void getMax(){
if(h>r) printf("-1\n") ;
else printf("%d\n", queue[h]) ;
}
int main(){
char temp[6] ;
int t, l ;
scanf("%d", &t) ;
while(t--){
h = n = l = 0 ;
r = -1 ;
queue[0] = 0 ;
scanf("%s", temp) ;
while(true){
scanf("%s", temp) ;
if(temp[0]=='C'){
scanf("%s", temp) ;
scanf("%d", &data[n]) ;
insert() ;
n ++ ;
}
else if(temp[0]=='Q'){
while(r>=h&&num[h]<l)
h ++ ;
getMax() ;
}
else if(temp[0]=='G')
l ++ ;
else break ;
}
}
return 0 ;
}