Cod sursa(job #1081463)

Utilizator NitaMihaitavoidcube NitaMihaita Data 13 ianuarie 2014 17:25:35
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream>
#include<cmath>
#define numaru 5000000
using namespace std;
int v[numaru],bb[2500],bbpoz[2500];
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    int n,i,j,k,m,l,nrz,op,edd,tempmax;
    f>>n>>m;
    l=sqrt(n+1);
    nrz=n/l;
    if(n%l!=0)++nrz;
    for(i=0;i<n;++i)
    {
        f>>v[i];
        if(i%l==0)bb[i/l]=v[i];
        else
        {
            if(v[i]>bb[i/l])bb[i/l]=v[i],bbpoz[i/l]=i;;
        }
    }
    for(;m;--m)
    {
        f>>op>>i>>j;
        if(op==1)
        {
            v[--i]=j;
            if(i==bbpoz[i/l])
            {
                bb[i/l]=j;
                for(k=i/l*l,edd=k+l;k<edd;++k)if(v[k]>bb[i/l])bb[i/l]=v[k];
            }
            else if(j>bb[i/l])bb[i/l]=j,bbpoz[i/l]=i;;

        }
        else
        {
            --i;
            --j;
            tempmax=0;
            if(i/l==j/l)
            {
                if( i%l==0 && ((j+1)%l==0 || j==n-1))tempmax=bb[i/l];
                else for(k=i;k<=j;++k)if(v[k]>tempmax)tempmax=v[k];
            }
            else
            {
                if(i%l==0) tempmax=bb[i/l];
                else for(k=i,edd=(i/l+1)*l-1;k<=edd;++k)if(v[k]>tempmax)tempmax=v[k];

                for(k=i/l+1,edd=j/l-1;k<=edd;++k)if(bb[k]>tempmax)tempmax=bb[k];

                if((j+1)%l==0 || j==n-1){if(bb[j/l]>tempmax)tempmax=bb[j/l];}
                else for(k=j/l*l;k<=j;++k)if(v[k]>tempmax)tempmax=v[k];
            }

            g<<tempmax<<"\n";
        }
    }
    f.close();
    g.close();
    return 0;
}