Cod sursa(job #2965372)

Utilizator andrei_sebi15Andrei andrei_sebi15 Data 15 ianuarie 2023 00:08:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100000
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int PInfinit=(1<<20);
typedef unsigned long long ull;
vector<ull>v(NMAX+1);
vector<ull>tree(4*NMAX+1);
ull maxim(ull a,ull b)
{
    if(a>=b)
        return a;
    return b;
}
void update_nod(int nod)
{
    tree[nod]=maxim(tree[2*nod],tree[2*nod+1]);
}
void build(int nod,int st,int dr)
{
    if(st==dr)
     tree[nod]=v[st];
    else
    {
        int mij=(st+dr)/2;
        build(2*nod,st,mij);
        build(2*nod+1,mij+1,dr);
        update_nod(nod);
    }
}
void update(int nod,int st,int dr,int poz,ull val)
{
    if(st==dr)
        tree[nod]=val;
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij)
            update(2*nod,st,mij,poz,val);
        if(mij+1<=poz)
            update(2*nod+1,mij+1,dr,poz,val);
        update_nod(nod);
    }
}
ull query(int nod,int st,int dr,int qst,int qdr)
{
    if(qst<=st && dr<=qdr)
        return tree[nod];
    else
    {
        int mij=(st+dr)/2;
        ull s1,s2;
        s1=s2=0;
        if(qst<=mij)
            s1=query(2*nod,st,mij,qst,qdr);
        if(mij+1<=qdr)
            s2=query(2*nod+1,mij+1,dr,qst,qdr);
        return maxim(s1,s2);
    }
}
int main()
{
    int n,m;in>>n>>m;
    for(int i=1;i<=n;i++)
     in>>v[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int t;in>>t;
        if(!t)
        {
            int x,y;in>>x>>y;
            out<<query(1,1,n,x,y)<<'\n';
        }
        else
        {
            int x;ull y;in>>x>>y;
            update(1,1,n,x,y);
        }
    }
    return 0;
}