void search(D &d, typename D::State &s0) { bool optimal = false; rowhdr(); this->start(); closed.init(d); incons.init(d); Node *n0 = init(d, s0); closed.add(n0); open.push(n0); unsigned long n = 0; do { if (improve(d)) { n++; double epsprime = wt == 1.0 ? 1.0 : findbound(); if (wt < epsprime) epsprime = wt; row(n, epsprime); } if (wt <= 1.0) { optimal = true; break; } nextwt(); updateopen(); closed.clear(); } while(!this->limit() && !open.empty()); this->finish(); dfpair(stdout, "converged", "%s", optimal ? "yes" : "no"); }
int main() { int Qs,lim; scanf("%d%d%d",&n,&Qs,&lim); for(int i=1;i<=n;i++){ scanf("%d",&ag[i].sc); ag[i].id=i; } std::sort(ag+1,ag+1+n); for(int i=1,p1,p2,dis;i<=n-1;i++) { scanf("%d%d%d",&p1,&p2,&dis); addEdge(p1,p2,dis); addEdge(p2,p1,dis); } distort[1]=0;esum[0]=0; dfs(1); dfs2(1,1); for(int i=1;i<=n;i++) esum[i]+=esum[i-1]; for(int i=1;i<=n;i++) sumdis[i]=sumdis[i-1]+distort[ag[i].id]; for(int i=1,p;i<=n;i++) { p=ag[i].id; rot[i]=rot[i-1]; while(top[p]!=1){rot[i]=update(rot[i],dfo[top[p]],dfo[p],1,n);p=fa[top[p]];} rot[i]=update(rot[i],1,dfo[p],1,n); } long long preans=0; for(int i=1,mise,ra,rb,ll,rr;i<=Qs;i++) { scanf("%d%d%d",&mise,&ra,&rb); ll=Min((preans+ra)%lim,(preans+rb)%lim); rr=Max((preans+ra)%lim,(preans+rb)%lim); ll=findbound(ll); rr=findupper(rr); printf("%lld\n",(preans=(sumdis[rr]-sumdis[ll-1])+distort[mise]*(rr-ll+1)-(query(rot[rr],mise)-query(rot[ll-1],mise))*2)); } }