Cod sursa(job #2615400)

Utilizator Razvank206Dumitriu Razvan Razvank206 Data 14 mai 2020 15:48:54
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
const int N=1000004;
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int n, m, a[N],v[N], op, m1, m2, maxi;



void constructie( int s, int d, int nr)
{
    if(s == d)
        v[nr] = a[d];
    else
    {
        int mijl = (s + d) / 2;

        constructie(s, mijl, nr*2);
        constructie(mijl+1, d, nr*2+1);
        if(v[2*nr] > v[2*nr + 1])
            v[nr] = v[2*nr];
        else
            v[nr] = v[2*nr + 1];
    }
}

void operatie0(int nr,int s,int d,int pozitie)
{
    if(s==d)
    {
        v[nr]=a[s];
        return;
    }
    else{
        int mijl = (s + d) / 2;

        if(pozitie <= mijl)

            operatie0(nr * 2, s , mijl, pozitie);
        else
            operatie0(nr * 2 +1, mijl+ 1, d, pozitie);


        if(v[2*nr] > v[2*nr + 1])
            v[nr] = v[2*nr];
        else
            v[nr] = v[2*nr + 1];
    }
}
void operatie1(int nr,int s,int d,int x,int y)
{
    if(x<=s && y>=d)
    {
        if(maxi<v[nr])
            maxi=v[nr];
    }
    else
    {
        int mijl=(s+d)/2;
        if(x<=mijl) operatie1(nr*2,s,mijl,x,y);
        if(y>mijl) operatie1(nr*2+1,mijl+1,d,x,y);
    }
}



int main()
{
    f >> n >> m;
    for(int i=1; i<=n; i++)
        f >> a[i];
    constructie(1,n,1);
    for(int i=0; i<m; i++)
    {
        f >> op >> m1 >> m2;
        if(op == 0)
        {
            maxi = 0;
            operatie1(1, 1,n, m1, m2);
            g << maxi << '\n';
        }
        else
        {
            a[m1] = a[m2];
            operatie0(1, 1, n , m1);
        }

    }

    return 0;
}