Cod sursa(job #2965254)

Utilizator George123456789Rebeles George George123456789 Data 14 ianuarie 2023 18:43:41
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int tree[100002],v[10002];
void update(int a,int b,int nod,int st,int dr)
{
    if(a<st || a>dr) return;

    if(a==st && a==dr)
    {
        tree[nod]=b;
        return;
    }
    int mij=(st+dr)/2;
    if(a>=st && a<=dr)
    {
        update(a,b,2*nod,st,mij);
        update(a,b,2*nod+1,mij+1,dr);
    }
    tree[nod]=tree[nod*2]*10+tree[nod*2+1];


}
void build_tree(int nod, int st, int dr)
{
    if(st == dr)
    {
        tree[nod] = v[st];
        return;
    }

    int mij = (st + dr) / 2;
    build_tree(2 * nod, st, mij);
    build_tree(2 * nod + 1, mij + 1, dr);

    tree[nod] = tree[2 * nod]*10 + tree[2 * nod + 1];
}
int query(int a,int b,int nod,int st,int dr)
{
    int mij, max1, max2;

    if (st==dr)
    {
        if(st<a || dr>b)
            return 0;
        else return tree[nod];
    }

    else

    {
        mij=(st+dr)/2;

        max1=query(a,b,nod*2,st,mij);

        max2=query(a,b,nod*2+1,mij+1,dr);

        if (max1>max2)

            return max1;

        else

            return max2;
    }

}



int N,M,X,A,B;
int main()
{

    f>>N>>M;
    for(int i=1; i<=N; i++)
        f>>v[i];
    build_tree(1,1,N);
    for(int i=1; i<=M; i++)
    {
        f>>X;
        f>>A;
        f>>B;
        if(X==1)
        {
            update(A,B,1,1,N);


        }
        if(X==0)
            g<<query(A,B,1,1,N)<<endl;
    }

}