Cod sursa(job #791657)

Utilizator RaileanuCristian Raileanu Raileanu Data 24 septembrie 2012 18:58:33
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include<fstream>
#include<math.h>

using namespace std;
int a[100010],n,m,nrint, i, b[1000];

int interog(int x, int y){
    int max=a[x],k;
    if (x/m +1 == y/m+1)
        for (k=x; k<=y; k++) a[k]>max ? max=a[k] : max=max;
        else
            {for (k=x; k<(x/m +1)*m; k++ )
                a[k]>max ? max=a[k] : max=max;
             for (k=x/m+2; k<y/m+1; k++)
                b[k]>max ? max=b[k] : max=max;
             for (k=(y/m+1)*m-m; k<=y; k++ )
                a[k]>max ? max=a[k] : max=max; };
    return max;};

void modific(int x,int y){
    a[x]=y;
    int max=a[(x/m+1)*m];
    for (int k=(x/m+1)*m-m; k<(x/m+1)*m; k++ )
        a[k]>max ? max=a[k] : max=max;
    b[x/m+1]=max;};

int main() {
    ifstream f1("arbint.in");
    ofstream f2("arbint.out");
    f1>>n>>nrint;
    for (int i=1; i<=n; i++)
        f1>>a[i];

    m=sqrt(n)+1;
    for (i=1; i<=n; i++)
        if (a[i]>b[i / m+ 1]) b[i / m+1]=a[i];

    int tip,x,y;
    for (i=1; i<=nrint; i++)
        { f1>>tip>>x>>y;
          if (tip==0) f2<<interog(x,y)<<'\n';
          if (tip==1) modific(x,y);
        };

    f1.close();
    f2.close();
    return 0;
}