Cod sursa(job #3211618)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 9 martie 2024 17:45:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>

#define ll long long

//#define fin cin
//#define fout cout

using namespace std;

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

int v[100005];

struct aint
{
    int st, dr, val;
    aint *left, *right;
} *root;
void init_arbint (int st, int dr, aint *nod)
{
    nod->st=st; nod->dr=dr; nod->val=-1;
    //cout<<st<<' '<<dr<<endl;
    if (st==dr) return;
    nod->left=new aint; nod->right=new aint;
    int mid=(st+dr)/2;
    init_arbint(st, mid, nod->left); init_arbint(mid+1, dr, nod->right);
}

void set_value (int index, aint *nod, int val)
{
    int st=nod->st, dr=nod->dr;
    if (st==dr) {
        nod->val=val;
        return;
    }
    int mid=(st+dr)/2;
    if (index<=mid) set_value(index, nod->left, val);
    else set_value(index, nod->right, val);
    nod->val=max(nod->left->val, nod->right->val);
}
/*
1 5
1 3                 4 5
1 2      3          
*/
int query(int a, int b, aint *nod)
{
    //st   a b     dr
    //a st b dr
    //st a dr b
    //a st dr b Imposibil?
    if (nod==NULL) {
        cout<<a<<' '<<b<<endl;
        cout<<"Nod null"<<endl;
        return -1;
    }
    //cout<<"Apel"<<endl;
    int st=nod->st, dr=nod->dr;
    int mid=(st+dr)/2;  
    int rez1=-1, rez2=-1;
    //if (st==dr) return nod->val;
    if (a<=st&&b>=dr) return nod->val; //st   a mid b     dr
    if (a<=mid) {
        rez1=query(a, b, nod->left);
        if (rez1==-1) cout<<"Rez 1: "<<st<<' '<<dr<<' '<<a<<' '<<b<<endl;
    }
    if (b>mid) {
        rez2=query(a, b, nod->right);
        if (rez2==-1) cout<<"Rez 2: "<<st<<' '<<dr<<' '<<a<<' '<<b<<endl;
    }
    return max(rez1, rez2);
}

int main()
{
    fin.tie(0); fin.sync_with_stdio(false);
    int n, m; fin>>n>>m;
    root=new aint;
    init_arbint(1, n, root);
    for (int i=1; i<=n; i++) {
        fin>>v[i];
        set_value(i, root, v[i]);
    }
    for (int i=1; i<=m; i++) {
        int c, a, b;
        fin>>c>>a>>b;
        if (c==0) {
            fout<<query(a, b, root)<<'\n';
        }
        if (c==1) {
            set_value(a, root, b);
        }
    }
    return 0;
}