Cod sursa(job #2396845)

Utilizator marinaoprOprea Marina marinaopr Data 3 aprilie 2019 21:12:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <stdio.h>
#include <math.h>
#include <iostream>

#define DIM 100005

using namespace std;

FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");

int n,m,SQRT,a[DIM],cerinta,A,B,bucket[620],ans,ibuc,abuc,bbuc,i,j;

int main()
{
    fscanf(fin, "%d%d", &n,&m);

    SQRT = sqrt(n) +1;

    for(i=0; i<n; ++i)
    {
        fscanf(fin, "%d", &a[i]);
        bucket[i/SQRT] = max(bucket[i/SQRT], a[i]);
    }

    for(i=1; i<=m; ++i)
    {
        fscanf(fin, "%d%d%d", &cerinta,&A,&B);
        --A;

        if(cerinta == 1)
            if((a[A] != bucket[A/SQRT]) or (a[A] == bucket[A/SQRT] and B>a[A]))
            {
                a[A] = B;
                bucket[A/SQRT] = max(bucket[A/SQRT], B);
            }
            else
            {
                a[A] = B;
                bucket[A/SQRT] = 0;
                ibuc = A/SQRT;
                for(j=ibuc*SQRT; j<(ibuc+1)*SQRT; ++j)
                    bucket[ibuc] = max(bucket[ibuc], a[j]);
            }
        else //cerinta = 0;
        {
            --B;

            abuc = A/SQRT;
            bbuc = B/SQRT;

            if(abuc == bbuc)
            {
                ans = 0;
                for(j=A; j<=B; ++j)
                    ans = max(ans, a[j]);
            }
            else
            {
                ans = 0;
                for(j=A; j<(abuc+1)*SQRT; ++j)
                    ans = max(ans, a[j]);
                for(j=abuc+1; j<=bbuc-1; ++j)
                    ans = max(ans, bucket[j]);
                for(j=bbuc*SQRT; j<=B; ++j)
                    ans = max(ans, a[j]);
            }

            fprintf(fout, "%d\n", ans);
        }
    }


    fclose(fin);
    fclose(fout);
    return 0;
}