Cod sursa(job #2017100)

Utilizator cipri321Marin Ciprian cipri321 Data 31 august 2017 11:51:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#define DIM 300000
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
int n,m;
int A[DIM];
int M[DIM];
void init(int v,int l,int r)
{
    if(l==r)
        M[v]=l;
    else
    {
        init(2*v,l,(l+r)/2);
        init(2*v+1,(l+r)/2+1,r);
        if(A[M[2*v]]>=A[M[2*v+1]])
            M[v]=M[2*v];
        else
            M[v]=M[2*v+1];
    }
}
int query(int v,int st,int dr,int l,int r)
{
    if(st>r || dr<l)
        return -1;
    if(st>=l&&dr<=r)
        return M[v];
    int p1=query(2*v,st,(st+dr)/2,l,r);
    int p2=query(2*v+1,(st+dr)/2+1,dr,l,r);
    if(p1==-1)
        return p2;
    if(p2==-1)
        return p1;
    if(A[p1]>=A[p2])
        return p1;
    return p2;
}
void update(int v,int l,int r,int poz,int val)
{
    if(poz<l||poz>r)
        return;
    if(l==r)
    {
        A[l]=val;
        return;
    }
    update(2*v,l,(l+r)/2,poz,val);
    update(2*v+1,(l+r)/2+1,r,poz,val);
    if(A[M[2*v]]>=A[M[2*v+1]])
        M[v]=M[2*v];
    else
        M[v]=M[2*v+1];
}
int main()
{
    fi>>n>>m;
    for(int i=1;i<=n;i++)
        fi>>A[i];
    init(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int t,a,b;
        fi>>t>>a>>b;
        if(t==0)
            fo<<A[query(1,1,n,a,b)]<<"\n";
        else
            update(1,1,n,a,b);
    }
    fi.close();
    fo.close();
    return 0;
}