Cod sursa(job #2082376)

Utilizator VoineaAndreiVoinea Ioan-Andrei VoineaAndrei Data 6 decembrie 2017 07:49:23
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<bits/stdc++.h>
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

vector<int> a;
vector<int> b;
int k;

void update(int i){
    b[i/k]=0;
    for(int j=(i/k)*k;j<(i/k+1)*k;++j)
    if(a[j]>b[i/k]) b[i/k]=a[j];
}

int maxim(int xa,int xb){
    int maxx=0;
    for(int i=xa;i<=xb;++i){
        if(i%k==0 && xb/k>i/k) {
            if( b[i/k] > maxx) maxx=b[i/k];
            i+=k-1;
        }
        else
            if(a[i]>maxx)maxx=a[i];

    }
    return maxx;
}


int main(){
    int n,m;f>>n>>m;

    k=sqrt(n);

    int x;
    for(int i=0;i<n;++i) {
            f>>x;
            a.push_back(x);

            if(i%k==0) b.push_back(a[i]);
            else if(a[i]>b[i/k]) b[i/k]=a[i];
    }
    bool op;
    int xa,xb,maxx=0;
    for(int i=1;i<=m;++i){
            f>>op>>xa>>xb;
        if(op){
            a[xa-1]=xb;
            update(xa-1);
        }
        else{
            maxx=maxim(xa-1,xb-1);
            g<<maxx<<'\n';
        }
    }
}