UVA 12299 RMQ with Shifts(线段树)

来源:互联网 发布:glassfish java ee 编辑:程序博客网 时间:2024/05/15 05:38
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=400000+5;int l,r;struct Interval{    int minv[maxn];    void clear() {memset(minv,0,sizeof(minv));}    void updata(int o,int L,int R,int v,int p)    {        if(L==R) {minv[o]=v;return ;}        int mid=(L+R)/2;        if(p<=mid) updata(o*2,L,mid,v,p);        else updata(o*2+1,mid+1,R,v,p);        minv[o]=min(minv[o*2],minv[o*2+1]);    }        int query(int o,int L,int R)    {        if(l<=L&&r>=R) return minv[o];        int mid=(L+R)/2;        if(r<=mid) return query(o*2,L,mid);        else if(l>mid) return query(o*2+1,mid+1,R);        else return min(query(o*2,L,mid),query(o*2+1,mid+1,R));    }        void debug(int o,int L,int R){        if(L==R) return ;        int mid=(L+R)/2;        debug(o*2,L,mid);        debug(o*2+1,mid+1,R);    }};Interval tree;int val[maxn],agus[30];char cmd[30];int main(){    int n,q;    scanf("%d%d",&n,&q);    tree.clear();    for(int i=1;i<=n;i++) {scanf("%d",&val[i]);tree.updata(1,1,n,val[i],i);}    while(q--)    {        scanf("%s",cmd);        memset(agus,0,sizeof(agus));        int k=0;        for(int i=6;cmd[i];i++){            if(isdigit(cmd[i])) agus[k]=agus[k]*10+cmd[i]-'0';            else k++;        }        if(cmd[0]=='s'){            for(int i=0;i<k-1;i++){                int x=agus[i],y=agus[i+1];                tree.updata(1,1,n,val[y],x);                tree.updata(1,1,n,val[x],y);                swap(val[x],val[y]);            }                    }        else{            l=agus[0],r=agus[1];            printf("%d\n",tree.query(1,1,n));        }    }    return 0;}

0 0