Cod sursa(job #2988769)

Utilizator vlad79xVlad79X vlad79x Data 5 martie 2023 14:26:42
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 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 maxxer(int a,int b){
  int pr_bk_cmpl=(a+BKSize-1)/BKSize,ul_bk_cmpl=(b-BKSize+1)/BKSize+1,pr_bk_ind=pr_bk_cmpl*BKSize,ul_bk_ind=(ul_bk_cmpl+1)*BKSize-1,rez=0;
  if(b-a+1>BKSize){
		for(int i=a;i<pr_bk_ind;i++)
			rez=max(rez,v[i]);
		for(int i=pr_bk_cmpl;i<=ul_bk_cmpl;i++)
			rez=max(rez,bt[i]);
		for(int i=ul_bk_ind;i<=b;i++)
			rez=max(rez,v[i]);
  } else {
  	for(int i=a;i<=b;i++)
  		rez=max(rez,v[i]);
  }
  //cout<<pr_bk_cmpl<<" "<<pr_bk_ind<<" "<<ul_bk_cmpl<<" "<<ul_bk_ind<<"\n";
  return rez;
}
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[i/BKSize],v[i]);
    }
    for(int i=0; i<q; i++) {
        cin>>op;
        if(op==1) {
            cin>>a>>b;
            a--;
            if(v[a]==bt[a/BKSize]) {
                v[a]=b;
                update_max(a/BKSize);
            } else {
                v[a]=b;
                bt[a/BKSize]=max(bt[a/BKSize],v[a]);
            }
        } else {
            cin>>a>>b;
            a--;
            b--;
            cout<<maxxer(a,b)<<"\n";
        }
    }
    return 0;
}