Cod sursa(job #2203506)

Utilizator danielsociuSociu Daniel danielsociu Data 12 mai 2018 15:51:12
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <vector>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
#define mx 100050
#define maxim(a,b) (a>b)?a:b

int ST[mx], DR[mx], A[mx], arb[mx], N, M, k, sizea, X, Y;

int update();
int querry();

int main()
{
    int tip;
    cin>>N>>M;
    for(int i=1;i<=N;i++)
        cin>>A[i];
    sizea=0;
    while(sizea*sizea<=N)sizea++;
    sizea--;
    k=N/sizea+1;
    for(int i=1;i*sizea<=N;i++){
        arb[i]=-1;
        ST[i]=sizea*(i-1)+1; DR[i]=sizea*i;
        for(int nod=ST[i];nod<=DR[i];nod++)
            arb[i]=maxim(arb[i],A[nod]);
    }
    for(int i=1;i<=M;i++){
        cin>>tip>>X>>Y;
        if(tip) update();
        else cout<<querry()<<endl;
    }
}

int update()
{
    A[X]=Y;
    for(int i=1;i<=k;i++)
    {
        if(X>=ST[i]&&X<=DR[i]){
            arb[i]=-1;
            for(int nod=ST[i];nod<=DR[i];nod++)
                arb[i]=maxim(arb[i],A[nod]);
            break;
        }
    }
}
int querry()
{
    int st=(1<<30),dr=-1, maxi=-1;
    for(int i=1;i<=k;i++)
        if(ST[i]>=X&&DR[i]<=Y){
            if(st>=ST[i]) st=ST[i];
            if(dr<=DR[i]) dr=DR[i];
            maxi=maxim(maxi,arb[i]);
        }
    if(st==(1<<30)&&dr==-1) st=dr=Y;
    for(int i=X;i<=st;i++)maxi=maxim(A[i],maxi);
    for(int i=dr;i<=Y;i++)maxi=maxim(A[i],maxi);
    return maxi;
}