Cod sursa(job #2631332)

Utilizator loraclorac lorac lorac Data 29 iunie 2020 22:04:46
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.99 kb
#include<bits/stdc++.h>

#include <fstream>

#include <algorithm>

#include <cstdio>

using namespace std;



int fast(string s,string t)



{



    int dp[100][100];



    cin>>s>>t;



    for(int i=0; i<s.size(); ++i)



        for(int j=0; j<t.size(); ++j)



        {



            if(s[i]==t[j])



                dp[i][j]=dp[i-1][j-1];



            else



                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);



        }



    return dp[s.size()-1][t.size()-1];



    for(int i=1;; --i)



        cout<<s[i];



}



struct helper

{



    long long st,dr,mij;



    long long sum;



};



const int N=200005;



helper aint[4*N];



int v[N];



void mrge(int nod)

{



    helper fiust=aint[2*nod];



    helper fiudr=aint[2*nod+1];



    helper &x=aint[nod];







    x.st=max(fiust.st,fiust.sum+fiudr.st);



    x.dr=max(fiudr.dr,fiudr.sum+fiust.dr);



    x.sum=fiust.sum+fiudr.sum;



    x.mij=max(max(fiust.mij,fiudr.mij),fiust.dr+fiudr.st);



}



const long long INF=1LL<<40;



void build(int nod,int st,int dr)

{



    if(st>dr)



        return;



    if(st==dr)

    {



        aint[nod]= {v[st],v[st],v[st],v[st]};



        return;



    }



    int mid=(st+dr)/2;



    build(2*nod,st,mid);



    build(2*nod+1,mid+1,dr);



    mrge(nod);



}







void update(int nod,int st,int dr,int upoz,int val)

{



    if(st>dr || upoz<st || upoz>dr)

    {



        return;



    }



    if(st==dr)

    {



        aint[nod]= {val,val,val,val};



        return;



    }



    int mid=(st+dr)/2;



    update(2*nod,st,mid,upoz,val);



    update(2*nod+1,mid+1,dr,upoz,val);



    mrge(nod);



}



void query(int nod,int st,int dr,int qst,int qdr,helper &rasp)

{



    if(st>dr || qdr<st || qst>dr)

    {



        return;



    }



    if(qst<=st && dr<=qdr)

    {



        rasp.mij=max(max(rasp.mij,aint[nod].mij),rasp.dr+aint[nod].st);



        rasp.dr=max(aint[nod].dr,aint[nod].sum+rasp.dr);



        return;



    }



    int mid=(st+dr)/2;



    query(2*nod,st,mid,qst,qdr,rasp);



    query(2*nod+1,mid+1,dr,qst,qdr,rasp);



}



int main()



{



    FILE*fin,*fout;



    fin=fopen("sequencequery.in","r");



    fout=fopen("sequencequery.out","w");



    int n,q;



    fscanf(fin,"%d%d",&n,&q);



    for(int i=1; i<=n; i++)

    {



        fscanf(fin,"%d",&v[i]);



    }



    build(1,1,n);



    for(int i=1; i<=q; i++)

    {



        int a,b;



        fscanf(fin,"%d%d",&a,&b);



        helper rasp= {-INF,-INF,-INF,-INF};



        query(1,1,n,a,b,rasp);



        fprintf(fout,"%lld\n",rasp.mij);



    }



    return 0;



}