Cod sursa(job #1769243)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 2 octombrie 2016 11:37:51
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <stdio.h>
#define LIM 131072
#include <ctype.h>
//solutia cu parsare
using namespace std;
FILE *fi, *fo;
struct padure{
  long long pref, suf, sum, ssm;
  inline void reset(long long val){
    pref=sum=ssm=suf=val;
  }
} copac[400000];

int a, b, poz=LIM, poz2=0;
char BUF[LIM], BUF2[LIM];

inline char getChar(){
  poz++;
  if(poz>=LIM){
    fread(BUF,LIM,1,fi);
    poz=0;
  }
  return BUF[poz];
}

inline int getNr(){
  int r=0, semn=1;
  char ch=getChar();
  while(isdigit(ch)==0 && ch!='-') ch=getChar();
  if(ch=='-'){
    semn=-1;
    ch=getChar();
  }
  while(isdigit(ch)!=0){
    r=r*10+semn*(ch-'0');
    ch=getChar();
  }
  return r;
}

inline void putch(char ch){
  BUF2[poz2++]=ch;
  if(poz2==LIM){
    fwrite(BUF2,LIM,1,fo);
    poz2=0;
  }
}

inline void baga(long long x){
  char s[15];
  int k=0;
  if(x<0){
    putch('-');
    x=-x;
  }
  do{
    s[k++]=x%10+'0';
    x/=10;
  }while(x);
  while(k>0){
    k--;
    putch(s[k]);
  }
}

inline long long maxim(long long a, long long b){
  if(a<b)
    return b;
  return a;
}

inline struct padure calcul(struct padure a, struct padure b){
  struct padure rez;
  rez.pref = maxim ( a.pref, a.sum+b.pref );
  rez.suf = maxim ( b.suf, a.suf+b.sum );
  rez.sum = a.sum + b.sum;
  rez.ssm = maxim( maxim( a.ssm, b.ssm ), a.suf+b.pref );
  return rez;
}

void add(int nod, int st, int dr){
  if(st==dr && st==a){
    copac[nod].reset(b);
    return;
  }
  int div=(dr+st)/2;
  if(a<=div)
    add(2*nod,st,div);
  else
    add(2*nod+1,div+1,dr);
  copac[nod]=calcul(copac[2*nod],copac[2*nod+1]);
}

struct padure query(int nod, int st, int dr){
  if(a<=st && dr<=b){
    return copac[nod];
  }
  int div=dr+st;
  struct padure rez;
  div/=2;
  rez.reset(-1000000000000);
  if(a<=div)
    rez=query(2*nod,st,div);
  if(b>div)
    rez=calcul(rez,query(2*nod+1,div+1,dr));
  return rez;
}


int main()
{
  int n, m, i;
  fi=fopen("sequencequery.in", "r");
  fo=fopen("sequencequery.out", "w");
  n=getNr(); m=getNr();
  for(i=1;i<=n;i++){
    a=i;
    b=getNr();
    add(1,1,n);
  }
  for(i=1;i<=m;i++){
    a=getNr(); b=getNr();
    baga( query(1,1,n).ssm );
    putch('\n');
  }
  if(poz2>0)
    fwrite(BUF2,poz2,1,fo);
  fclose(fi);
  fclose(fo);
  return 0;
}