#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,k;
const int MAXN = 5e5+5;
pair<int,int> arr[MAXN];
int ranks[MAXN];
int rev[MAXN];
struct segmenttree{
int seg[4*MAXN];
void build(int curr,int l,int r){
if(l==r){
seg[curr] = rev[l];
return;
}
int mid = (l+r)/2;
build(2*curr,l,mid);
build(2*curr+1,mid+1,r);
seg[curr] = max(seg[2*curr],seg[2*curr+1]);
}
int query(int curr,int l,int r,int tl,int tr){
if(l>tr||r<tl){
return -1e9;
}
if(tl<=l && r<=tr){
return seg[curr];
}
int mid = (l+r)/2;
return max(query(2*curr,l,mid,tl,tr),query(2*curr+1,mid+1,r,tl,tr));
}
int lmost(int curr,int l,int r,int val){
if(seg[curr]<val){
return r+1;
}
if(l==r){
return l;
}
int mid = (l+r)/2;
if(seg[2*curr]>val){
return lmost(2*curr,l,mid,val);
}else if(seg[2*curr+1]>val){
return lmost(2*curr+1,mid+1,r,val);
}else{
return r+1;
}
}
int rmost(int curr,int l,int r,int val){
if(seg[curr]<val){
return l-1;
}
if(l==r){
return l;
}
int mid = (l+r)/2;
if(seg[2*curr+1]>val){
return rmost(2*curr+1,mid+1,r,val);
}else if(seg[2*curr]>val){
return rmost(2*curr,l,mid,val);
}else{
return l-1;
}
}
void update(int curr,int l,int r,int ind ,int val){
if(l==r){
seg[curr] = val;
return;
}
int mid = (l+r)/2;
if(ind<=mid){
update(2*curr,l,mid,ind,val);
}else{
update(2*curr+1,mid+1,r,ind,val);
}
seg[curr] = max(seg[2*curr],seg[2*curr+1]);
}
} segl,segr;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>arr[i].first;
arr[i].second = i;
}
sort(arr+1,arr+n+1);
for(int i=1;i<=n;i++){
ranks[i] = arr[i].second;
rev[arr[i].second] = i;//what rank is ith position
}
if(k!=1){
segl.build(1,1,k-1);
}
if(k!=n){
segr.build(1,k+1,n);
}
int q;
cin>>q;
int ub = max(1,n-10);
while(q--){
char s;
cin>>s;
if(s=='F'){
int x;
cin>>x;
if(x==k){
cout<<0<<endl;
continue;
}
if(x<k){
int temp = segl.query(1,1,k-1,x,k-1);
int temp2 = n+1;
if(temp!=n){
temp2 = segr.lmost(1,k+1,n,temp);
}
//cout<<x<<" "<<temp2<<endl;
cout<<temp2-x-1<<endl;
}else{
int temp = segr.query(1,k+1,n,k+1,x);
int temp2 = 0;
// cout<<123<<" "<<temp<<endl;
if(temp!=n){
temp2 = segl.rmost(1,1,k-1,temp);
}
// cout<<123<<" "<<temp2<<endl;
cout<<x-temp2-1<<endl;
}
}else{
int curr,val;
cin>>curr>>val;
//cout<<curr<<" "<<val<<endl;
val = n-val+1;
// cout<<curr<<" "<<val<<endl;
//cout<<1234<<" "<<curr<<" "<<val<<endl;
//cout<<1234<<" "<<val<<" "<<rev[curr]<<endl;
for(int i=val;i>max(ub,rev[curr]);i--){
// cout<<123<<" "<<ranks[2]<<" "<<i-1<<endl;
//cout<<1234<<" "<<i<<" "<<ranks[i]<<" "<<min(rev[curr],min(10,n))<<endl;
if(ranks[i] == k){
continue;
}
if(ranks[i]<k){
segl.update(1,1,k-1,ranks[i],i-1);
}else{
segr.update(1,k+1,n,ranks[i],i-1);
}
}
for(int i=max(ub,rev[curr]+1);i<=val;i++){
ranks[i-1] = ranks[i];
rev[ranks[i]] = i-1;
//cout<<(i-1)<<" "<<ranks[i-1]<<endl;
}
ranks[val] = curr;
rev[curr] = val;
// cout<<endl;
/* for(int i=1;i<=n;i++){
// cout<<rev[i]<<" ";
}
// cout<<endl;
for(int i=1;i<=n;i++){
// cout<<ranks[i]<<" ";
}*/
//cout<<endl;
if(curr==k){
continue;
}
if(curr<k){
segl.update(1,1,k-1,curr,val);
}else{
segr.update(1,k+1,n,curr,val);
}
}
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
384 KB |
Output is correct |
2 |
Incorrect |
6 ms |
384 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
498 ms |
1504 KB |
Output isn't correct |
2 |
Correct |
426 ms |
640 KB |
Output is correct |
3 |
Incorrect |
486 ms |
1272 KB |
Output isn't correct |
4 |
Correct |
423 ms |
640 KB |
Output is correct |
5 |
Incorrect |
530 ms |
1784 KB |
Output isn't correct |
6 |
Correct |
518 ms |
1656 KB |
Output is correct |
7 |
Incorrect |
528 ms |
1788 KB |
Output isn't correct |
8 |
Correct |
451 ms |
1152 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
335 ms |
3576 KB |
Output isn't correct |
2 |
Correct |
320 ms |
3448 KB |
Output is correct |
3 |
Correct |
317 ms |
3320 KB |
Output is correct |
4 |
Correct |
4 ms |
384 KB |
Output is correct |
5 |
Incorrect |
422 ms |
7032 KB |
Output isn't correct |
6 |
Incorrect |
413 ms |
7008 KB |
Output isn't correct |
7 |
Correct |
411 ms |
6776 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
102 ms |
632 KB |
Output isn't correct |
2 |
Incorrect |
109 ms |
632 KB |
Output isn't correct |
3 |
Incorrect |
205 ms |
2416 KB |
Output isn't correct |
4 |
Incorrect |
195 ms |
2424 KB |
Output isn't correct |
5 |
Incorrect |
293 ms |
1276 KB |
Output isn't correct |
6 |
Incorrect |
379 ms |
3448 KB |
Output isn't correct |
7 |
Incorrect |
440 ms |
2040 KB |
Output isn't correct |
8 |
Incorrect |
304 ms |
3704 KB |
Output isn't correct |
9 |
Incorrect |
1355 ms |
9084 KB |
Output isn't correct |
10 |
Incorrect |
994 ms |
2504 KB |
Output isn't correct |
11 |
Incorrect |
1091 ms |
3192 KB |
Output isn't correct |
12 |
Incorrect |
1315 ms |
8228 KB |
Output isn't correct |
13 |
Incorrect |
1177 ms |
10104 KB |
Output isn't correct |