Cod sursa(job #1217819)

Utilizator hasmasandragosHasmasan Dragos hasmasandragos Data 8 august 2014 13:08:13
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <cmath>
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int maxim,poz,aux1,aux2,h=1,ini,pol,i,j,st,dr,l,n,m,q,a[100005],b[420];

int posb (int x)
{
   int y;
   y=x%l+1;
   return y;
}

int bgnx (int x)
{
    int y;
    y=l*x;
    return y;
}

int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
     f>>a[i];
    l=sqrt(n);
    for (i=1;i+l-1<=n;i=i+l)
     {
        for (j=i;j<=i+l-1;j++)
             if (a[j]>b[h])
              b[h]=a[j];
        h++;
     }
     if (i<=n)
      for (j=i;j<=n;j++)
       if (a[j]>b[h])
        b[h]=a[j];
    for (i=1;i<=m;i++)
    {
        f>>q;
        if (q)
        {
            f>>ini>>pol;
            a[ini]=pol;
            poz=posb(ini);
            for (j=bgnx(poz);j<=bgnx(poz)+l-1;j++)
             if (a[j]>b[poz])
              b[poz]=a[j];
        }
       else
       {
           f>>st>>dr;
           aux1=posb(st);
           aux2=posb(dr);
           if (aux1==aux2 || aux1==aux2-1)
            {
                maxim=0;
                for (j=st;j<=dr;j++)
                 if (a[j]>maxim)
                  maxim=a[j];
                g<<maxim<<'\n';
            }
           else
           {
               maxim=0;
               for (j=aux1+1;j<=aux2-1;j++)
                if (b[j]>maxim)
                 maxim=b[j];
               for (j=st;j<=bgnx(aux1)+l-1;j++)
                if (a[j]>maxim)
                 maxim=a[j];
               for (j=bgnx(aux2);j<=dr;j++)
                if (a[j]>maxim)
                 maxim=a[j];
              g<<maxim<<'\n';
           }
       }
    }
    return 0;
}