Cod sursa(job #3191419)

Utilizator AlexandruDrg23Draghici Alexandru AlexandruDrg23 Data 9 ianuarie 2024 18:05:35
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <tuple>
using namespace std;

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

vector<int> v;
vector<int> elem;
int sol=1<<30;
void build(int t,int st,int dr)
{
    if(st==dr)
    {
        v[t]=elem[st];
        return;
    }
    int mij=(st+dr)>>1;
    build(2*t,st,mij);
    build(2*t+1,mij+1,dr);
    v[t]=max(v[2*t],v[2*t+1]);
}

void update(int t,int st,int dr,int p,int x)
{
    if(st==dr)
    {
        v[t]=x;
        return;
    }
    int mij=(st+dr)>>1;
    if(p<=mij)
        update(t*2,st,mij,p,x);
    else
        update(t*2+1,mij+1,dr,p,x);
    v[t]=max(v[t*2],v[t*2+1]);
}

void intr(int t,int st,int dr,int x,int y)
{
    if(x<=st && dr<=y)
    {
        sol=max(sol,v[t]);
        return;
    }
    int mij=(st+dr)>>1;
    if(x<=mij)
    {
        intr(t*2,st,mij,x,y);
    }
    if(y>mij)
    {
        intr(t*2+1,mij+1,dr,x,y);
    }
}

int main()
{
    int n,m;
    fin>>n>>m;
    v.resize(4*n+4);
    elem.resize(n+1);
    for(int k=1;k<=n;k++)
        fin>>elem[k];
    build(1,1,n);
    int c,x,y;
    for(int d=1;d<=m;d++)
    {
        fin>>c>>x>>y;
        if(c==1)
            update(1,1,n,x,y);
        else
        {
            sol=-(1<<30);
            intr(1,1,n,x,y);
            fout<<sol<<endl;
        }
    }
    return 0;
}