Cod sursa(job #2256169)

Utilizator HannaLieb Hanna Hanna Data 8 octombrie 2018 09:27:54
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

#define szam first
#define hely second

ifstream cin("arbint.in");
ofstream cout("arbint.out");

vector<pair<int,int> >v;

int n,m,i,k,a,b,c,j,ha,hb,maxi,av,bk;

int main()
{
    cin>>n>>m;
    k=sqrt(n);
    v.resize(n);
    vector<int>x(k);
    for(i=0;i<n;++i)
    {
        cin>>v[i].szam;
        if(i/k<k)
        {
            v[i].hely=i/k;
            if(v[i].szam>x[i/k]) x[i/k]=v[i].szam;
        }
        else
        {
            v[i].hely=i/k-1;
            if(v[i].szam>x[i/k-1]) x[i/k-1]=v[i].szam;
        }

    }

    for(i=1;i<=m;++i)
    {
        cin>>c>>a>>b;
        a--;
        if(c==0)
        {
            b--;
            ha=a/k;
            hb=b/k;
            if(hb==k)
            hb--;
            if(ha==k)
            ha--;

            if(ha==k-1) av=n-1;
            else av=(ha+1)*k;
            bk=hb*k;

            maxi=0;
            for(j=ha+1;j<hb;++j) if(x[j]>maxi) maxi=x[j];

            for(j=a;j<min(av,b);++j) if(v[j].szam>maxi) maxi=v[j].szam;
            for(j=max(bk,a);j<=b;++j) if(v[j].szam>maxi) maxi=v[j].szam;

            cout<<maxi<<"\n";
        }
        else if(c==1)
        {
            if(b>x[v[a].hely])
            {
                x[v[a].hely]=b;
                v[a].szam=b;
            }
            else if(v[a].szam==x[v[a].hely])
            {
                v[a].szam=b;
                x[v[a].hely]=0;
                for(j=k*v[a].hely;j<=v[a].hely+k-1;++j)
                if(v[j].szam>x[v[a].hely]) x[v[a].hely]=v[j].szam;

                if(v[a].hely==k-1)
                for(j=j;j<=n;++j)
                if(v[j].szam>x[v[a].hely]) x[v[a].hely]=v[j].szam;
            }
            else v[a].szam=b;
        }
    }

    return 0;
}