线段树的单点修改,可以套模板的样子~,算是模板题吧~
代码:‘
#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; }