Cod sursa(job #2344981)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 15 februarie 2019 19:30:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int NMAX = 100005;
const int SQRTMAX = 350;
int v[NMAX];
int a[SQRTMAX];
int n,m;

int find_interv(int x,int lgint)
{
    int nr=x/lgint;
    if(x%lgint==0) return nr;
    return (nr+1);
}

void actualizare(int interval,int lgint)
{
    int start=lgint*(interval-1)+1;
    int stop=start+lgint-1;
    int maxim1=0;
    for(int i=start;i<=stop;i++)
    {
        if(v[i]>maxim1) maxim1=v[i];
    }
    a[interval]=maxim1;
}

int main()
{
    fin >> n >> m;
    for(int i=1;i<=n;i++) fin >> v[i];
    int rad=sqrt(n);
    int k=0,maxim=0;
    for(int i=1;i<=n;i++)
    {
        if(v[i]>maxim) maxim=v[i];
        if(i%rad==0)
        {
            a[++k]=maxim;
            maxim=0;
        }
    }
    if(rad*rad!=n) a[++k]=maxim;
    int operatie,x,y;
    for(int i=1;i<=m;i++)
    {
        fin >> operatie >> x >> y;
        maxim=0;
        if(operatie==1)
        {
            v[x]=y;
            int interv = find_interv(x,rad);
            actualizare(interv,rad);
        }
        else if(operatie==0)
        {
            int interv1 = find_interv(x,rad);
            int interv2 = find_interv(y,rad);
            if(interv1==interv2)
            {
                for(int i=x;i<=y;i++) if(v[i]>maxim) maxim=v[i];
                fout << maxim << '\n';
            }
            else
            {
                for(int i=interv1+1;i<=interv2-1;i++)
                {
                    if(a[i]>maxim) maxim=a[i];
                }
                int st=rad*(interv2-1)+1;
                int dr=rad*interv1;
                for(int i=x;i<=dr;i++) if(v[i]>maxim) maxim=v[i];
                for(int i=y;i>=st;i--) if(v[i]>maxim) maxim=v[i];
                fout << maxim << '\n';
            }
        }
    }
    return 0;
}