Cod sursa(job #910632)

Utilizator PatrikStepan Patrik Patrik Data 10 martie 2013 22:00:38
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
    #include<cstdio>
    #include<iostream>
    #include<fstream>
    using namespace std;
    #define MAX 400002
    int N , M , V[MAX/2] , A[MAX]  , x , y , z;
    ifstream f("arbint.in");
    void citire();
    void build(int n , int l , int r);
    void update(int n , int l , int r );
    int query(int n , int l , int r);

    int main()
    {
        freopen("arbint.out" , "w" , stdout );
        citire();
        build(1,1,N);
        for(int i = 1 ; i <= M  ; ++i )
        {
            f>>x>>y>>z;
            if(x == 0)
                printf("%d\n" ,query(1,1,N));
            else
            {
                V[y] = z;
                update(1,1,N);
            }
        }
        f.close();
        return 0;
    }

    void citire()
    {
        f>>N>>M;
        for(int i = 1 ; i<=N ; ++i )
            f>>V[i];
    }

    void build(int n , int l , int r )
    {
        if(l == r)A[n] = V[l];
        else
        {
            int m = (l+r)/2;
            build(2*n,l,m);
            build(2*n+1,m+1,r);
            A[n] = max(A[2*n],A[2*n+1]);
        }
    }

    int query(int n , int l , int r)
    {
        int maxx = 0;
        if(y <=l && z >= r)return A[n];
        else
        {
            int m = (l+r)/2;
            if(y<=m)
                maxx = query(2*n,l,m);
            if(z > m)
                maxx = max(maxx,query(2*n+1,m+1,r));
        }
        return maxx;
    }

    void update(int n ,int l , int r )
    {
        if(l==r && l==y)A[n] = V[y];
        if(l == r)return;
        else
        {
            int m = (l+r)/2;
            update(2*n,l,m);
            update(2*n+1,m+1,r);
            A[n] = max(A[2*n],A[2*n+1]);
        }
    }