Cod sursa(job #910666)

Utilizator PatrikStepan Patrik Patrik Data 10 martie 2013 22:23:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
    #include<cstdio>
    #include<fstream>
    using namespace std;
    #define MAX 400002
    int N , M , V[MAX/2] , A[MAX]  , x , y , z , maxim ;
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    void citire();
    void update(int n , int l , int r );
    void query(int n , int l , int r);
    int max(int a , int b){return a > b ? a : b ;}

    int main()
    {
        f>>N>>M;
        for(int i = 1 ; i <= N ; ++i )
        {
            f>>V[i];
            y = i;
            update(1,1,N);
        }
        for(int i = 1 ; i <= M  ; ++i )
        {
            f>>x>>y>>z;
            maxim = -1;
            if(x == 0){
            query(1,1,N);
            g<<maxim<<"\n";}
            else
            {
                V[y] = z;
                update(1,1,N);
            }
        }
        f.close();
        return 0;
    }

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

    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;
            if(y <= m)update(2*n,l,m);
            if (y >m )update(2*n+1,m+1,r);
            A[n] = max(A[2*n],A[2*n+1]);
        }
    }