#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=400000+5;
int l,r;
struct Interval{
int minv[maxn];
void clear() {memset(minv,0,sizeof(minv));}
void updata(int o,int L,int R,int v,int p)
{
if(L==R) {minv[o]=v;return ;}
int mid=(L+R)/2;
if(p<=mid) updata(o*2,L,mid,v,p);
else updata(o*2+1,mid+1,R,v,p);
minv[o]=min(minv[o*2],minv[o*2+1]);
}
int query(int o,int L,int R)
{
if(l<=L&&r>=R) return minv[o];
int mid=(L+R)/2;
if(r<=mid) return query(o*2,L,mid);
else if(l>mid) return query(o*2+1,mid+1,R);
else return min(query(o*2,L,mid),query(o*2+1,mid+1,R));
}
void debug(int o,int L,int R){
if(L==R) return ;
int mid=(L+R)/2;
debug(o*2,L,mid);
debug(o*2+1,mid+1,R);
}
};
Interval tree;
int val[maxn],agus[30];
char cmd[30];
int main()
{
int n,q;
scanf("%d%d",&n,&q);
tree.clear();
for(int i=1;i<=n;i++) {scanf("%d",&val[i]);tree.updata(1,1,n,val[i],i);}
while(q--)
{
scanf("%s",cmd);
memset(agus,0,sizeof(agus));
int k=0;
for(int i=6;cmd[i];i++){
if(isdigit(cmd[i])) agus[k]=agus[k]*10+cmd[i]-'0';
else k++;
}
if(cmd[0]=='s'){
for(int i=0;i<k-1;i++){
int x=agus[i],y=agus[i+1];
tree.updata(1,1,n,val[y],x);
tree.updata(1,1,n,val[x],y);
swap(val[x],val[y]);
}
}
else{
l=agus[0],r=agus[1];
printf("%d\n",tree.query(1,1,n));
}
}
return 0;
}
UVA 12299 RMQ with Shifts(线段树)
最新推荐文章于 2022-05-08 22:35:06 发布