Cod sursa(job #3150424)

Utilizator vlad79xVlad79X vlad79x Data 16 septembrie 2023 15:13:43
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#include <fstream>
using namespace std;
const int nmax=4e5;
int lazy[nmax+3],aint[nmax+3],v[nmax/4+3],n;

void push_aint(int node) {
        if(node<2*n&&lazy[node]!=-1) {
                lazy[node*2]=lazy[node];
                lazy[node*2+1]=lazy[node];

                aint[node*2]=lazy[node];
                aint[node*2+1]=lazy[node];

                lazy[node]=-1;
        }
}

void update_aint(int node,int st,int dr,int l,int r,int val) {
        if(dr<st||st>r||dr<l)
                return;

        else if(st==l&&dr==r) {
                aint[node]=val;
                lazy[node]=val;

        } else {
                int mid=(st+dr)/2;

                update_aint(node*2,st,mid,l,r,val);
                update_aint(node*2+1,mid+1,dr,l,r,val);

                aint[node]=max(aint[node*2],aint[node*2+1]);
        }
}

int query_aint(int node,int st,int dr,int l,int r) {
        if(dr<st||st>r||dr<l)
                return 0;

        if(st==l&&dr==r)
                return aint[node];

        if(st==dr)
                return aint[node];

        else {
                push_aint(node);
                int mid=(st+dr)/2;

                return max(query_aint(node*2,st,mid,l,r),query_aint(node*2+1,mid+1,dr,l,r));
        }
}

void build_aint(int node, int st, int dr) {
        if(st == dr) {
                aint[node] = v[st];

        } else {
                int mid = (st + dr) / 2;

                build_aint(node*2, st, mid);
                build_aint(node*2+1, mid+1, dr);

                aint[node] = max(aint[node*2],aint[node*2+1]);
                lazy[node]=-1;
        }
}

int main() {
        ifstream cin("arbint.in");
        ofstream cout("arbint.out");
        int m,a,b,c;
        cin>>n>>m;
        for(int i=1; i<=n; i++) {
                cin>>v[i];
        }
        build_aint(1,1,n);
        //print();
        for(int i=1; i<=m; i++) {
                cin>>c>>a>>b;
                if(c==0) {
                        cout<<query_aint(1,1,n,a,b)<<"\n";
                } else {
                        update_aint(1,1,n,a,a,b);
                        //print();
                }
        }
        return 0;
}