Uva-12299-RMQ with Shifts

线段树的单点修改,可以套模板的样子~,算是模板题吧~

代码:‘

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=200001;
int n,m;
int a[maxn],t[maxn*2],c[maxn];
void Built(int l,int r,int index)
{
    if(l>r)
	return;
    if(l==r)
    {
	t[index]=a[l];
	return;
    }
    int mid=(l+r)>>1;
    Built(l,mid,index<<1);
    Built(mid+1,r,index<<1|1);
    t[index]=min(t[index<<1],t[index<<1|1]);
}
int Query(int l,int r,int L,int R,int index)
{
    if(l==L&&r==R)
	return t[index];
    int mid=(L+R)>>1;
    if(r<=mid)
	return Query(l,r,L,mid,index<<1);
    if(l>mid)
	return Query(l,r,mid+1,R,index<<1|1);
    return min(Query(l,mid,L,mid,index<<1),Query(mid+1,r,mid+1,R,index<<1|1));
}
void Update(int l,int r,int L,int R,int index)
{
    if(l==L&&r==R)
    {
	t[index]=a[l];
	return;
    }
    int mid=(L+R)>>1;
    if(r<=mid)
	Update(l,r,L,mid,index<<1);
    else
	Update(l,r,mid+1,R,index<<1|1);
    t[index]=min(t[index<<1],t[index<<1|1]);
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
	for(int i=1;i<=n;i++)
	    scanf("%d",&a[i]);
	Built(1,n,1);
	for(int i=0;i<m;i++)
	{
	    char ch;
	    int ita,itb,flag=0;
	    ch=getchar();
	    while(ch!='(')
	    {
		if(ch=='q')
		    flag=1;
		ch=getchar();
	    }
	    if(flag==1)
	    {
		scanf("%d,%d)",&ita,&itb);
		printf("%d\n",Query(ita,itb,1,n,1));
	    }
	    else
	    {
		int cou=0;
		while(1)
		{
		    scanf("%d%c",&c[cou++],&ch);
		    if(ch==')')
			break;
		}
		int ita=a[c[0]];
		for(int j=0;j<cou-1;j++)
		{
		    a[c[j]]=a[c[j+1]];
		    Update(c[j],c[j],1,n,1);
		}
		a[c[cou-1]]=ita;
		Update(c[cou-1],c[cou-1],1,n,1);
	    }
	}
    }
    return 0;
}


你可能感兴趣的:(线段树)