Cod sursa(job #3202215)

Utilizator Teodor94Teodor Plop Teodor94 Data 11 februarie 2024 08:53:56
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
// sursa tone alexandru
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

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

const int maxn=100005;
const int sqrtmaxn=sqrt(maxn);

int v[maxn], batog[sqrtmaxn];
int n, sqrtn;

void init(int n) {
    sqrtn=sqrt(n);
    for(int i=0; i<n; i++) {
        fin>>v[i];
        batog[i/sqrtn]=max(batog[i/sqrtn], v[i]);
    }
}

void update(int a, int b) {
    int st=a/sqrtn*sqrtn;
    int dr=(a/sqrtn+1)*sqrtn;

    v[a]=b;
    if(batog[a/sqrtn]<v[a])
        batog[a/sqrtn]=v[a];
    else {
        int maxx=0;
        for(int i=st; i<n && i<dr; i++)
            maxx=max(maxx, v[i]);
        batog[a/sqrtn]=maxx;
    }
}

int afis(int a, int b) {
    //a = 2, st = 3
    //b = 6, dr = 5
    
    int st=(a/sqrtn+1)*sqrtn;
    int dr=(b/sqrtn)*sqrtn-1;

    //cout << "akjsld:" << a << ' ' << b << ' ' << st << ' ' << dr << '\n';

    int maxx=0;
    for(int i=a; i<st && i<n; i++)
        maxx=max(maxx, v[i]);

    for(int i=dr+1; i<=b; i++)
        maxx=max(maxx, v[i]);

    for(int i=st; i<=dr; i++)
        maxx=max(maxx, batog[i/sqrtn]);

    return maxx;
    /*for(int i=0;i<n;i++)
        cout<<v[i]<<" ";
    cout<<'\n';*/
}


int main() {
    int q,op,a,b;
    fin>>n>>q;

    init(n);

    for(int i=0; i<q; i++) {
        fin>>op>>a>>b;
        if(op==1)
            update(a-1, b);
        else if(op==0)
            fout<<afis(a-1, b-1)<<'\n';
    }

    /*cout<<'\n';

    for(int i=0;i<n;i++)
      cout<<v[i]<<" ";
    cout<<'\n';
    for(int i=0;i<=sqrt(n);i++)
      cout<<batog[i]<<" ";*/


    return 0;
}