Cod sursa(job #1093856)

Utilizator kiralalaChitoraga Dumitru kiralala Data 28 ianuarie 2014 18:17:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#define NMAX 262150

using namespace std;

FILE* f=freopen("arbint.in","r",stdin);
FILE* o=freopen("arbint.out","w",stdout);

int n;
int a,b;
int tree[NMAX];
int maxim(int a, int b) {return (a>b)?a:b;}
int maxi;
void Update(int nod, int left, int right)
{
    int mj=left+(right-left)/2;
    if(left==right)
        tree[nod]=b;
    else {
        if(mj>=a)
            Update(2*nod,left,mj);
        else
            Update(2*nod+1,mj+1,right);
        tree[nod]=maxim(tree[nod*2],tree[nod*2+1]);
    }
}

void Ask(int nod, int left, int right)
{
    int mj=left+(right-left)/2;
    if(left>=a&&right<=b) {
        if(tree[nod]>maxi)
            maxi=tree[nod];
    }
    else {
        if(mj<b)
            Ask(2*nod+1,mj+1,right);
        if(mj>=a)
            Ask(2*nod,left,mj);
    }
}

int main()
{
    int m;
    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;++i)
    {
        a=i;
        scanf("%d",&b);
        Update(1,1,n);
    }

    for(int i=0;i<m;++i)
    {
        int act;
        scanf("%d%d%d",&act,&a,&b);

        if(act)
            Update(1,1,n);
        else {
            maxi=0;
            Ask(1,1,n);
            printf("%d\n",maxi);
        }
    }

    return 0;
}