Cod sursa(job #1929864)

Utilizator alexoloieriAlexandru Oloieri alexoloieri Data 18 martie 2017 11:05:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <algorithm>
#define LMAX 100005

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

int a, b;
int n;
int ARB[4*LMAX];
int maxx;

void citire();
void act(int nod, int st, int dr);
void maxim(int nod, int x, int y);

int main()
{
citire();
fclose(fin);
fclose(fout);
return 0;
}

void citire()
    {
     int m;
     int i;
     int c;
     fscanf(fin,"%d %d",&n,&m);
     for (i=1;i<=n;i++)
          {
           fscanf(fin,"%d", &b);
           a=i;
           act(1, 1, n);
          }
     for (i=1;i<=m;i++)
          {
           fscanf(fin,"%d %d %d", &c, &a, &b);
           if (c==0)
              {
               maxx=-1;
               maxim(1, 1, n);
               fprintf(fout,"%d\n", maxx);
              }
              else
              {
               act(1, 1, n);
              }
          }
    }

void act(int nod, int st, int dr)
    {
     int m;
     if (st==dr)
         {
          ARB[nod]=b;
          return ;
         }
     m=(st+dr)/2;
     if (a<=m)
         act(nod*2, st, m);
         else
         act(nod*2+1, m+1, dr);
     ARB[nod]=max(ARB[2*nod], ARB[2*nod+1]);
    }

void maxim(int nod, int x, int y)
    {
     int m;
     if (a<=x&&y<=b)
         {if (ARB[nod]>maxx)
             maxx=ARB[nod];}
             else
             {
              m=(x+y)/2;
              if (a<=m)
                  maxim(nod*2, x , m);
              if (b>m)
                  maxim(nod*2+1, m+1, y);
             }
    }