Cod sursa(job #1799265)

Utilizator al_k_ponyClaudiu Babin al_k_pony Data 5 noiembrie 2016 23:35:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 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 endl    '\n'
#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,mx,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]);
}

void qry(int nod,int l,int r)
{
    if(start<=l && r<=finish)
    {
        mx=max(mx,aint[nod]);
        return;
    }
    if(start<=(l+r)/2) qry(2*nod,l,(l+r)/2);
    if((l+r)/2<finish) qry(2*nod+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
        {
            mx = -1;
            start = y;
            finish = z;
            qry(1,1,n);
            cout << mx << endl;
        }
    }
    return 0;
}