Cod sursa(job #1799553)

Utilizator al_k_ponyClaudiu Babin al_k_pony Data 6 noiembrie 2016 14:30:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include        <bits/stdc++.h>
#define ll      long long
#define maxn    200005
#define rc(s)   return cout << s,0
#define _       ios_base::sync_with_stdio(false);cin.tie(0);
#define mp      make_pair
#define pii     pair<int,int>
#define vi      vector<int>
#define vll     vector<long long>
#define cin fin
#define cout fout
using namespace std;

const int inf = INT_MAX;
int n,m,val,pos,x,y,z,start,finish;
int aint[420420];


void upd(int nod,int l,int r)
{
    if(l==r)
    {
        aint[nod] = val;
        return ;
    }
    if(pos<=(l+r)/2) upd(nod*2,l,(l+r)/2);
    else upd(nod*2+1,(l+r)/2+1,r);
    aint[nod] = max(aint[nod*2],aint[nod*2+1]);
}

int qry(int nod,int l,int r)
{
    if(start<=l && finish>=r)
        return(aint[nod]);
    if(start > r || finish < l) return -1;
    return max(qry(nod*2,l,(l+r)/2),qry(nod*2+1,(l+r)/2+1,r));
}


int main(){
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    cin >> n >> m;
    for(int i = 1;i<=n;i++)
    {
        cin >> x;
        val = x;
        pos = i;
        upd(1,1,n);
    }
    for(int i = 1;i<=m;i++)
    {
        cin >> x >> y >> z;
        if(x)
        {
            val = z;
            pos = y;
            upd(1,1,n);
        }
        else
        {
            start = y;
            finish = z;
            cout << qry(1,1,n) << '\n';
        }
    }
    return 0;
}