Cod sursa(job #2502855)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 1 decembrie 2019 18:15:42
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <math.h>
using namespace std;
ifstream  cin("arbint.in");
ofstream cout("arbint.out");
int n,m,r,v[100005];
struct nod{
    int a,b,m;
}s[400];
int main(){
    int i,j,k,x,c,a,b;
    cin>>n>>m;
    r=sqrt(n);
    for(i=1;i<=n;i++)cin>>v[i];
    for(j=1,x=0,k=0,i=1;i<=n;i++){
        if(v[i]>x)x=v[i];
        if(i%r==0 || i==n){
            k++; s[k].a=j; s[k].b=i; s[k].m=x;
            j=i+1;x=0;
        }
    }
    while(m){
        cin>>c>>a>>b;
        if(c==0){
            i=1+(a-1)/r;
            j=1+(b-1)/r;
            if(i==j){
                x=0;
                while(a<=b){
                    if(v[a]>x)x=v[a];
                    a++;
                }
                cout<<x<<"\n";
            }
            else{
                x=0;
                while(a<=s[i].b){
                    if(v[a]>x)x=v[a];;
                    a++;
                }
                i++;
                while(i<j){
                    if(s[i].m>x)x=s[i].m;
                    i++;
                }
                a=s[j].a;
                while(a<=b){
                    if(v[a]>x)x=v[a];
                    a++;
                }
                cout<<x<<"\n";
            }
        }
        else{
            v[a]=b;
            i=1+(a-1)/r;
            x=0;
            for(j=s[i].a;j<=s[i].b;j++){
                if(v[j]>x)x=v[j];
            }
            s[i].m=x;
        }
        m--;
    }
    cin.close(); cout.close();
    return 0;
}