Cod sursa(job #2988739)

Utilizator vlad79xVlad79X vlad79x Data 5 martie 2023 13:52:49
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;
const int NMAX=100000,BKSize=1024;
int v[NMAX+3],bt[BKSize+3];
void update_max(int bk_ind) {
    bt[bk_ind]=0;
    int ind=bk_ind*BKSize;
    for(int i=ind; i<ind+BKSize; i++)
        bt[bk_ind]=max(bt[bk_ind],v[i]);
}
int main() {
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int n,q,op,a,b;
    cin>>n>>q;
    for(int i=0; i<n; i++) {
        cin>>v[i];
        bt[i/BKSize]=max(bt[BKSize],v[i]);
    }
    for(int i=0; i<q; i++) {
        cin>>op;
        if(op==1) {
            cin>>a>>b;
            if(v[a-1]==bt[a/BKSize]) {
                v[a-1]=b;
                update_max(a/BKSize);
            } else
                v[a-1]=b;
        } else {
            cin>>a>>b;
            if(b-a+1>=BKSize) {
                int bk_ind=((a+BKSize-1)/BKSize)*BKSize,bk_ind1=(b/BKSize)*BKSize,rez=0,bk_st=bk_ind/BKSize,bk_dr=bk_ind1/BKSize;
                for(int j=a-1; j<bk_ind; j++)
                    rez=max(rez,v[j]);
                for(int j=bk_st; j<=bk_dr; j++)
                    rez=max(rez,bt[j]);
                for(int j=bk_ind1; j<=b; j++)
                    rez=max(rez,v[j]);
                cout<<rez<<"\n";
            } else {
                int rez=0;
                for(int j=a-1; j<b; j++)
                    rez=max(rez,v[j]);
                cout<<rez<<"\n";
            }
        }
    }
    return 0;
}