TYVJ 1038 1039 忠诚、、、、、

忠诚2  
     
     
  描述 Description  
    老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题。
   在询问过程中账本的内容可能会被修改
     
     
  输入格式 Input Format  
  输入中第一行有两个数m,n表示有m(m<=100000)笔账,n表示有n个问题,n<=100000。
接下来每行为3个数字,第一个p为数字1或数字2,第二个数为x,第三个数为y
当p=1 则查询x,y区间
当p=2 则改变第x个数为y
     
     
  输出格式 Output Format  
  输出文件中为每个问题的答案。具体查看样例。
     
     
  样例输入 Sample Input  
  10 3 1 2 3 4 5 6 7 8 9 10 1 2 7 2 2 0 1 1 10
     
     
  样例输出 Sample Output  
  2 0
     
     
  时间限制 Time Limitation  
  各个测试点1s
   

 

 

#include<cstdio>

#include<cstring>

int n,m;

int a[100010];

#define LL(x) (x<<1)

#define RR(x) (x<<1|1)

#define min(a,b) a>b?b:a

 

struct TREE

{

    int left,right;

    int rmin;

    int mid() { return ((left+right)>>1);}

}tree[100010*3];

 

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

{

    tree[idx].left=l;

    tree[idx].right=r;

    if(tree[idx].left==tree[idx].right)

    {

        tree[idx].rmin=a[l];

        return ;

    }

    int mid=tree[idx].mid();

    build(l,mid,LL(idx));

    build(mid+1,r,RR(idx));

    tree[idx].rmin=min(tree[LL(idx)].rmin,tree[RR(idx)].rmin);

}

 

void update(int x,int y,int idx)

{

    if(tree[idx].left==tree[idx].right)

    {

        tree[idx].rmin=y;

        return;

    }

    int mid=tree[idx].mid();

    if(x<=mid) update(x,y,LL(idx));

    else if(x>mid) update(x,y,RR(idx));

    tree[idx].rmin=min(tree[LL(idx)].rmin,tree[RR(idx)].rmin);

}

 

int query(int l,int r,int idx)

{

    if(l<=tree[idx].left&&tree[idx].right<=r)

    {

        return tree[idx].rmin;

    }

    int mid=tree[idx].mid();

    if(l>mid) return query(l,r,RR(idx));

    else if(r<=mid) return query(l,r,LL(idx));

    else return min( query(l,mid,LL(idx)) , query(mid+1,r,RR(idx)));

}

 

int main()

{

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

    for(int i=1;i<=n;i++) scanf("%d",&a[i]);

    build(1,n,1);

    int a,x,y;

    int num=0;

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

    {

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

        if(a==1)

        {

            if(num!=0) printf(" ");

            num=1;

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

        }

        else

        {

            update(x,y,1);

        }

    }

    printf("/n");

    return 0;

}

你可能感兴趣的:(TYVJ 1038 1039 忠诚、、、、、)