Cod sursa(job #212171)

Utilizator marinMari n marin Data 4 octombrie 2008 15:37:36
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>
#define DIM 270000

struct str{
  long long a;
  long long b;
  long long c;
  long long s;
};

int n,m;
long long A[DIM],B[DIM],C[DIM],S[DIM];

long long maxim(long long a, long long b){
  if (a>b) return a;
  else return b;
}

void update(int st, int dr, int nod, int poz, int val) {
  int mij;
  if ((st==poz) && (dr==poz)) {
    A[nod] = B[nod] = C[nod] = S[nod] = val;
  } else {
    mij = (st+dr)/2;
    if (poz<=mij)
      update(st,mij,2*nod,poz,val);
    if (poz>mij)
      update(mij+1,dr,2*nod+1,poz,val);
    A[nod] = maxim(A[2*nod],S[2*nod]+A[2*nod+1]);
    B[nod] = maxim(B[2*nod+1],S[2*nod+1]+B[2*nod]);
    C[nod] = maxim(maxim(C[2*nod],C[2*nod+1]),A[2*nod+1]+B[2*nod]);
    S[nod] = S[2*nod]+S[2*nod+1];
  }
}

str query(int st, int dr, int nod, int a, int b) {
  int mij,ok1,ok2;
  str r,rs,rd;
  if ((a<=st) && (dr<=b)){
    r.a = A[nod];
    r.b = B[nod];
    r.c = C[nod];
    r.s = S[nod];
    return r;
  } else {
    mij = (st+dr)/2;
    ok1 = 0;
    if (a<=mij) {
      rs = query(st, mij, 2*nod, a, b);
      ok1 = 1;
    }
    ok2 = 0;
    if (b>mij) {
      rd = query(mij+1,dr, 2*nod+1, a, b);
      ok2 = 1;
    }
    if (ok1 && ok2) {
      r.a = maxim(rs.a,rs.s+rd.a);
      r.b = maxim(rd.b,rd.s+rs.b);
      r.c = maxim(maxim(rs.c,rd.c),rs.b+rd.a);
      r.s = rs.s+rd.s;
      return r;
    } else if (ok1) {
      return rs;
    } else
      return rd;
  }
}


int main() {
  int val,poz,a,b,op,i;
  str r;
  FILE *f = fopen("sequencequery.in","r");;
  FILE *g = fopen("sequencequery.out","w");;

  fscanf(f,"%d %d",&n,&m);
  for (i=1;i<=n;i++) {
    fscanf(f,"%d",&val);
    update(1,n,1,i,val);
  }
  for (i=1;i<=m;i++) {
    fscanf(f,"%d %d",&a, &b);
    r = query(1,n,1,a,b);
//    if (r.c<0)
//      r.c = 0;
    fprintf(g,"%lld\n",r.c);
  }

  fclose(g);
  fclose(f);
  return 0;
}