【Analysis】
这题其实在考输入吧,其他好像不难,shiftshiftshift就用线段树的单点修改即可
【Code】
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
typedef long long I64;
using namespace std;
inline int read() {
int ret=0;bool flag=0;char c=getchar();
while((c<'0')|(c>'9')) flag ^= !(c^'-'),c=getchar();
while((c>='0')&(c<='9')) ret=(ret<<3)+(ret<<1)+(c^'0'),c=getchar();
return flag?-ret:ret;
}
inline void Put(char * s) { puts(s); }
inline void Put(char c) { Put(&c); }
inline void Put(I64 x) { char c[25]={0}; sprintf(c,"%lld",x); Put(c); }
inline void Put(int x) { Put(x|(I64)0); }
const int M = 1e5 + 11;
const int INF = 0x3f3f3f3f;
namespace segment_tree
{
int _min[M<<2],n,m,num[M],s[M],shift[M];
inline void build_tree(int k,int l,int r)
{
if(l == r)
{
_min[k] = num[l];
return ;
}
int mid = l + r >> 1;
build_tree(k<<1,l,mid);
build_tree(k<<1|1,mid + 1,r);
_min[k] = min(_min[k<<1],_min[k<<1|1]);
}
inline void Modify(int k,int l,int r,int pos,int _num)
{
if(l == r)
{
_min[k] = _num;
return ;
}
int mid = l + r >> 1;
int lson = k<<1,rson = k<<1|1;
if(pos <= mid) Modify(lson,l,mid,pos,_num);
else Modify(rson,mid + 1,r,pos,_num);
_min [k]= min(_min[lson],_min[rson]);
}
inline int query(int k,int l,int r,int x,int y)
{
if((x <= l)&(y >= r)) return _min[k];
int lson = k<<1,rson = k<<1|1;
int mid = l + r >> 1;
int ans = INF;
if(x <= mid) ans = min(query(lson,l,mid,x,y),ans);
if(y > mid) ans = min(ans,query(rson,mid + 1,r,x,y));
return ans;
}
inline int get_number(char* op)
{
int len = strlen(op + 1);
int dex = 1;
bool flag=0;
s[dex] = 0;
for(int i = 1;i <= len; i++)
{
if(op[i]>='0'&&(op[i]<='9'))
{
s[dex] = (s[dex]<<3) + (s[dex]<<1) + op[i] - '0';
flag = 1;
}
else if(flag) s[++dex] = 0;
}
// for(int i = 0;i < dex; i++) printf("%d ",s[i]);
// puts("");
return dex - 1;
//这里是处理字符串的输入
}
inline void solve()
{
char op[55]={0};
scanf("%s",op + 1);
int dex = get_number(op);
if(op[1] == 's')
{
for(int i = 1;i <= dex; i++)
shift[i] = num[s[i]];
for(int i = 1;i <= dex; i++)
{
if(i + 1 <= dex)
num[s[i]] = shift[i + 1];
else
num[s[i]] = shift[1];
Modify(1,1,n,s[i],num[s[i]]);
}
}
else
Put(query(1,1,n,s[1],s[2]));
}
inline void Init()
{
while(~scanf("%d%d",&n,&m))
{
for(int i = 1;i <= n; i++)
num[i] = read();
build_tree(1,1,n);
while(m--)
solve();
}
}
}
using namespace segment_tree;
int main(void)
{
Init();
return 0;
}
/*
7 10
6 2 4 8 5 1 4
query(1,7)
shift(2,4,5,7)
query(1,7)
shift(2,3)
query(3,7)
query(3,5)
*/