Code[VS] 1481 忠诚

来源:互联网 发布:90年代网络歌曲 编辑:程序博客网 时间:2024/04/30 20:55

【题意】给定长度为n的数列,m个询问,每次询问区间最小值

【代码】

#include <cstdio>

#include <cstring>

#include <cstdlib>

#include <climits>


using namespace std;


const int N=100001;


struct T

{

int mn,l,r;

}tr[N<<2];

int n,m,x,y;


int min(int i,int j)

{

return i<j?i:j;

}


void build(int now,int l,int r)

{

tr[now].l=l;

tr[now].r=r;

tr[now].mn=INT_MAX;

if (l^r)

{

int t=l+r>>1;

build(now<<1,l,t);

build(now<<1|1,t+1,r);

}

}


void ins(int now,int d,int add)

{

if (tr[now].l==tr[now].r)

{

tr[now].mn=add;

return;

}

int t=tr[now].l+tr[now].r>>1;

if (d<=t) ins(now<<1,d,add); else ins(now<<1|1,d,add);

tr[now].mn=min(tr[now<<1].mn,tr[now<<1|1].mn);

}


int query(int now,int l,int r)

{

if (l<=tr[now].l&&tr[now].r<=r) return tr[now].mn;

int t=tr[now].l+tr[now].r>>1,res=INT_MAX;

if (l<=t) res=min(res,query(now<<1,l,r));

if (t<r) res=min(res,query(now<<1|1,l,r));

return res;

}


int main(void)

{

freopen("test.in","r",stdin);

scanf("%d%d",&n,&m);

build(1,1,n);

for (int i=1;i<=n;i++)

{

scanf("%d",&x);

ins(1,i,x);

}

for (int i=1;i<=m;i++)

{

scanf("%d%d",&x,&y);

printf("%d ",query(1,x,y));

}

printf("\n");

return 0;

}


0 0
原创粉丝点击