Cod sursa(job #2648266)

Utilizator mihhTURCU MIHNEA ALEXANDRU mihh Data 9 septembrie 2020 18:07:00
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin ("arbint.in");
ofstream fout("arbint.out");

int m,n;
vector<int> ai;

void update(int ind, int val, int le=1,int ri=n, int node=0){
    //     static int once=1;
    //     if(once ) cout<<"\n"<<ind<<" "<<val<<"\n\n", once=0;

    // cout<<le<<" "<<ri<<"   "<<node<<"\n";
    if(le==ri) {
        // once=1;
        ai[node]=val;
        return ;
    }
    int mi=(le+ri)/2;
    int nnode=node*2+1;
    if(ind<=mi) update(ind,val, le, mi, nnode);
    else update(ind,val, mi+1,ri, nnode+1);
    ai[node]=max(ai[nnode],ai[nnode+1]);
}

int search(int a, int b, int le=1, int ri=n, int node=0){
    // cout<<le<<" "<<ri<<"\n";
    // cout<<a<<" "<<b<<"\n";
    // cout<<"node "<<node<<"  "<<ai[node]<<"\n\n";

    if(a==le and b==ri) {
        // cout<<"--";
        cout<<ai[node]<<"  ";
        return ai[node];
    }
    int mi=(le+ri)/2, ans=-1;
    node=node*2+1;
    if(a<=mi) ans=max(ans,search(a,min(b,mi), le,mi, node) );
    if(b>mi)  ans=max(ans,search(max(a,mi+1),b, mi+1,ri, node+1) );
    return ans;
}

int main() {
    fin>>n>>m;
    {
        int p=0;
        for(int i=1; p<n; p+=i,i<<=1)
            ;
        ai.resize(p*2,0);
    }
    for(int i=1;i<=n;++i){
        int x;
        fin>>x;
        update(i,x);
    }
    for(int i=1;i<=m;++i){
        int k, x,y;
        fin>>k>>x>>y;
        if(k==0){
            // [a,b]
            // cout<<x<<".."<<y<<"\n";
            // int se=search(x,y);
            // fout<<se<<"\n";
            // cout<<"\n___\n";
        }
        else {
            // a[a]=b
            update(x,y);
        }
    }
}