题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1110
代码应该比较容易理解。之后回顾的时候再写思路
#include<stdio.h>
#include<string.h>
#include<iostream>
const int inf=0x3f3f3f3f;
using namespace std;
int mine[1000005];
int n,q;
char ss[1000005];
void build(int l,int r,int pos)
{
if(l==r)
{
scanf("%d",&mine[pos]);
return;
}
int mid=(l+r)>>1;
build(l,mid,pos<<1);
build(mid+1,r,pos<<1|1);
mine[pos]=min(mine[pos<<1],mine[pos<<1|1]);
}
int qu(int a,int b,int l,int r,int pos)
{
int res=inf;
if(a<=l&&b>=r)
{
return mine[pos];
}
int mid=(l+r)>>1;
if(mid>=a)
res=min(res,qu(a,b,l,mid,pos<<1));
if(b>mid)
res=min(res,qu(a,b,mid+1,r,pos<<1|1));
return res;
}
void shift(int l,int r, int pos,int st,int v)
{
if(l==r)
{
mine[pos]=v;
return;
}
int mid=(l+r)>>1;
if(st<=mid)
shift(l,mid,pos<<1,st,v);
else
shift(mid+1,r,pos<<1|1,st,v);
mine[pos]=min(mine[pos<<1],mine[pos<<1|1]);
}
int main()
{
scanf("%d%d",&n,&q);
build(1,n,1);
while(q--)
{
int i=6;
scanf("%s",ss);
if(ss[0]=='q')
{
int ll=0,rr=0;
for(i; ss[i]!=','; i++)
{
ll=(ll)*10+ss[i]-'0';
}
for(i++; ss[i]!=')'; i++)
{
rr=(rr)*10+ss[i]-'0';
}
printf("%d\n",qu(ll,rr,1,n,1));
/*for(int l=1;l<n;l++)
for(int i=1;i+l<=n;i++)
{
printf("%d %d %d\n",i,i+l,qu(i,i+l,1,n,1));
}
for(int i=1;i<=n*4;i++){
cout<<mine[i]<<endl;
}*/
}
else
{
i=6;
int a[100005],j=0;
memset(a,0,sizeof(a));
while(ss[i]!=')')
{
if(ss[i]==',')
{
j++;
}
else
{
a[j]=a[j]*10+ss[i]-'0';
}
i++;
}
int end=qu(a[0],a[0],1,n,1);
for(int i=0; i<j; i++)
{
int c=(i+1)%(j+1);
int v=qu(a[c],a[c],1,n,1);
shift(1,n,1,a[i],v);
}
shift(1,n,1,a[j],end);
/*for(int i=0;i<j;i++)
{
cout<<a[i]<<endl;
cout<<endl;
}
for(int i=1;i<=n*4;i++){
cout<<mine[i]<<endl;
}*/
}
}
}