7 5 6 2 4 8 5 1 4 query(3,7) shift(2,4,5,7) query(1,4) shift(1,2) query(2,2)
1 4 6
湖南省第七届大学生计算机程序设计竞赛
思路:
与基本的线段树差不多,只要理解他的移位就行了。如1,4,6. 1,4,6->4,1,6->4,6,1.这为数组下标,按下标将数组值交换就行了。
AC代码:
#include
#include
#include
#include
#include
using namespace std;
#define T 300005
#define inf 0x3f3f3f3f
int n,m,a[T],b[T];
struct node
{
int L,R;
int min;
}tree[T<<2];
void PushUp(int root)
{
tree[root].min = min(tree[root<<1].min,tree[root<<1|1].min);
}
void Build(int root,int L,int R)
{
tree[root].L = L,tree[root].R = R;
tree[root].min = inf;
if(L==R){
tree[root].min = a[L];
return;
}
int mid = (L+R)>>1;
Build(root<<1,L,mid);
Build(root<<1|1,mid+1,R);
PushUp(root);
}
int qurey(int root,int L,int R)
{
if(tree[root].L==L&&tree[root].R==R){
return tree[root].min;
}
if(R<=tree[root<<1].R){
return qurey(root<<1,L,R);
}
else if(L>=tree[root<<1|1].L){
return qurey(root<<1|1,L,R);
}
else{
int mid = (tree[root].L+tree[root].R)>>1;
int a = qurey(root<<1,L,mid);
int b = qurey(root<<1|1,mid+1,R);
return min(a,b);
}
}
void UpDate(int root,int pos,int val)
{
if(tree[root].L == tree[root].R){
tree[root].min = val;
return;
}
if(pos<=tree[root<<1].R){
UpDate(root<<1,pos,val);
}
else {
UpDate(root<<1|1,pos,val);
}
PushUp(root);
}
int main()
{
/*freopen("input.txt","r",stdin);*/
int i,j,k,c;
char str[6];
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",&a[i]);
scanf("\n");
Build(1,1,n);
while(m--)
{
c=0;
scanf("%c%c%c%c%c%c",&str[0],&str[1],&str[2],&str[3],&str[4],&str[5]);
if(str[0]=='q')
{
scanf("%d,%d)\n",&j,&k);
printf("%d\n",qurey(1,j,k));
}
else
{
while(scanf("%d,",&b[c++])==1);
scanf(")\n");
for(i=1;i