Cod sursa(job #2657685)

Utilizator tudorbuhniaTudor Buhnia tudorbuhnia Data 11 octombrie 2020 15:24:19
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int ai[100005],v[270000],mx=0,n,cnt=0;
void bt(int nod)
{
    if(nod==1)
        return;
    int n2;
    if(nod%2==0)
        n2=nod+1;
    else
        n2=nod-1;
    v[nod/2]=max(v[nod],v[n2]);
    bt(nod/2);
}
void up(int st,int dr,int nod,int a,int b,int p)
{
    if(p==0)
    {
        if(b>v[nod])
        {
            v[nod]=b;
        }
    }
    else
    {
        if(st==dr)
        {
            v[nod]=0;
            bt(nod);
            return;
        }
    }
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    if(st<=a && a<=mij)
    {
        up(st,mij,nod*2,a,b,p);
    }
    else
    {
        up(mij+1,dr,nod*2+1,a,b,p);
    }
}
void inter(int nod,int st,int dr,int a,int b)
{
    if(st==a && dr==b)
    {
        if(v[nod]>mx)
            mx=v[nod];
        return;
    }
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    int x=0,y=0;
    if(mij+1<=a && a<=dr)
        x=1;
    if(mij+1<=b && b<=dr)
        y=1;
    if(x==0 && y==0)
    {
        inter(nod*2,st,mij,a,b);
    }
    if(x==1 && y==1)
    {
        inter(nod*2+1,mij+1,dr,a,b);
    }
    if(x==0 && y==1)
    {
        inter(nod*2,st,mij,a,mij);
        inter(nod*2+1,mij+1,dr,mij+1,b);
    }
}
int main()
{
    int m,a,b,p;
    cin >> n >> m;
    for(int i=1;i<=n;i++)
    {
        cin >> ai[i];
        up(1,n,1,i,ai[i],0);
    }
    for(int i=1;i<=m;i++)
    {
        cin >> p >> a >> b;
        if(p==0)
        {
            mx=0;
            inter(1,1,n,a,b);
            cout << mx << '\n';
        }
        else
        {
            if(b>ai[a])
            {
                ai[a]=b;
                up(1,n,1,a,b,0);
            }
            if(b<ai[a])
            {
                up(1,n,1,a,b,1);
                ai[a]=b;
                up(1,n,1,a,b,0);
            }
        }
    }
    return 0;
}