Cod sursa(job #2082685)

Utilizator MrRobotMrRobot MrRobot Data 6 decembrie 2017 18:01:55
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

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

int v[100001];
int intervale[317];

int main()
{
    int n, m;
    int i, rad;
    fin>>n>>m;
    rad = sqrt(n);
    for(i=0; i<n; i++)
    {
        fin>>v[i];
        if(intervale[i/rad] < v[i])
            intervale[i/rad] = v[i];
    }


    /*for(int j=0; j<=n/rad; j++)
        cout<<intervale[j]<<" ";
    cout<<endl<<endl;*/

    int maxim;
    for(i=1; i<=m; i++)
    {
        maxim = 0;
        int op, a, b; //vectorul meu e de la 0 deci vom accesa a-1 si b-1
        fin>>op>>a>>b;
        if(op == 0)
        {





            if(a==b)
            {
                fout<<v[a-1]<<endl;
                continue;
            }
            if( (b - a) < rad )
            {
                for(int j = a-1; j<=b-1; j++)
                    if(v[j] > maxim)
                        maxim = v[j];
                fout<<maxim<<endl;

            }
            else
            {
                int j;
                for(j = a-1; j < ((a-1)/rad+1)*rad; j++ )
                    if(v[j] > maxim)
                        maxim = v[j];

                for(j = (a-1)/rad+1; j < b/rad; j++ )   //b-1+1 <- daca e ult elem din secventa de rad
                    if(intervale[j] > maxim)
                        maxim = intervale[j];

                for(j= (b/rad)*rad; j < b; j++)
                    if(v[j] > maxim)
                        maxim = v[j];
                fout<<maxim<<endl;
            }
        }
        else
        {
            if(b > intervale[(a-1)/rad])
            {
                intervale[(a-1)/rad] = b;
                v[a-1] = b;
                continue;
            }
            //else =>  se schimba maximul deci trebuie actualizat
            v[a-1] = b;
            for(int j = ((a-1)/rad)*rad; j< ((a-1)/rad+1)*rad; j++)
                if(v[j] > intervale[(a-1)/rad])
                    intervale[(a-1)/rad] = v[j];
        }
    }

}